2016-03-28 31 views
0

Her yolun başlangıç ​​/ bitiş yollarını içeren yollar içeren bir masa var.Aralık boşluklarını analiz edin

bu verileri analiz etmek ve daha fazla aynı veri değeri olan 'boşluk' dolgulu kolon adı ile yollar arasındaki boşlukların başlangıç ​​/ ucunun kilometre içeren satırlar ile sorgu almak gerekir.

Başlangıç ​​tablosu:

 
id name  kmstart kmend 
1  road1  0  150 
2  road2  150  200 
3  road3  220  257 
4  road4  260  290 

Sonuç sorgusu:

 
id name  kmstart kmend 
1  road1  0  150 
2  road2  150  200 
null gap  200  220 
3  road3  220  257 
null gap  257  260 
4  road4  260  290 
+0

fyi: "name" ayrılmış bir sözcük ve bu nedenle bir sütun adı için gerçekten çok kötü bir seçimdir. deneyin: "road_name" ... – Ditto

+0

Gerçek tablo farklı isimlerle. Bu sadece bir örnek – adelak

+0

Bize bir "çalışma örneği" vermelisiniz .. o zaman hata ayıklamak zorunda kurgusal bir değil ..;) – Ditto

cevap

2

bu sorguyu deneyin:

SELECT NULL, 'gap', previous_kmend AS kmstart, kmstart AS kmend 
FROM (
    SELECT id, name, kmstart, kmend, LAG(kmend) OVER (ORDER BY kmstart, kmend) AS previous_kmend 
    FROM roads 
) 
WHERE previous_kmend < kmstart 
UNION ALL 
SELECT id, name, kmstart, kmend 
FROM roads 
ORDER BY kmstart, kmend 

Sadece ufak bir test koymak ve bu benim için çalışıyor.

Önceki kmend satırını almak için LAG işlevini kullanır ve geçerli kaydın kmstart satırından daha azsa "boşluk" satırını döndürür. Son zamanlarda bir article about the LAG function yazdım, hatırlamak yardımcı oldu.

Bundan sonra var mı?

Ayrıca, diğer yorumculardan da bahsettikleri gibi, "isim", ayrılmış bir sözcük olduğu için iyi bir sütun adı değildir. Kodu burada bıraktım, bu yüzden sorunuzla tutarlı.