2016-04-13 76 views
-1

我有這樣的一個SQL表附低於查找不連續運行值

+-----+------------+-------+-----+ 
| ID | Name | Start | End | 
+-----+------------+-------+-----+ 
| 100 | Road one |  0 | 244 | 
| 101 | Road two |  0 | 300 | 
| 101 | Road two | 300 | 329 | 
| 101 | Road two | 329 | 400 | 
| 101 | Road two | 400 | 380 | 
| 102 | Road three |  0 | 120 | 
| 102 | Road three | 122 | 175 | 
| 102 | Road three | 175 | 222 | 
+-----+------------+-------+-----+ 

我需要找出所有正在運行的StartEnd值這是不連續的每一個獨特的ID

在上面的示例380中,小於400的值不正確,而122大於120,這也不正確,因爲它應該是120(以前的End值)。

我需要一個sql腳本來突出顯示這些值。

幫助表示讚賞

+0

我可以做在報告生成器中非常容易,甚至寫一個小型的c#應用程序,但我需要一個可移植的SQL腳本來做到這一點現在 –

+0

因此,你應該至少展示你的嘗試。 –

+0

可不可以給我一分鐘,我會回答我自己的問題 –

回答

1

如果您正在使用SQL Server 2012及更高版本,您可以使用LAG功能,您可以通過用戶在下面的查詢

設置數據

create table #t (ID int, Name varchar(20), Start int , [End] int) 

insert into #t values 
(100 , 'Road one' ,  0 , 244), 
(101 , 'Road two' ,  0 , 300), 
(101 , 'Road two' , 300 , 329), 
(101 , 'Road two' , 329 , 400), 
(101 , 'Road two' , 400 , 380), 
(102 , 'Road three' ,  0 , 120), 
(102 , 'Road three' , 122 , 175), 
(102 , 'Road three' , 175 , 222) 

查詢

with cte as (
    select ID, Name, Start, [End] 
    , LAG([End]) over (partition by ID order by ID, Start, [End]) PrevEnd 
    from #t 
) 
select ID, Name, Start, [End] 
from cte 
where Start <> PrevEnd or [End] < Start 

結果

+-----+------------+-------+-----+ 
| ID | Name | Start | End | 
+-----+------------+-------+-----+ 
| 101 | Road two | 400 | 380 | 
| 102 | Road three | 122 | 175 | 
+-----+------------+-------+-----+ 
+0

非常感謝,我也在爲一個cte,但我不知道LAG功能。我還必須在'order by'子句中添加'start'和'end',它完美地工作。 –

+0

感謝您的反饋意見。你是對的,他們應該按順序排列。我會編輯我的答案。 – FLICKER

+0

偉大的工作,很少使用LAG功能。 – Licantropo

0

試試這個:

--this select row | 102 | Road three |  0 | 120 | 
SELECT * 
FROM table AS t1 
WHERE NOT Exists (SELECT 1 FROM table AS t2 WHERE t2.start = t1.end AND t2.id = t1.id) 
AND Exists (SELECT 1 FROM table AS t2 WHERE t2.start > t1.end AND t2.id = t1.id) 

--this select row| 102 | Road three | 122 | 175 | 
SELECT * 
FROM table AS t1 
WHERE NOT Exists (SELECT 1 FROM table AS t2 WHERE t2.end = t1.start AND t2.id = t1.id) 
AND t1.start <> 0 
0

下具有的條件是,如果以前的行存在的ID,那麼就必須有一個上一行用相同的結尾:

select t.* 
from t 
where end < start or 
     (not exists (select 1 from t t2 where t2.id = t.id and t2.end = t.start) and 
     exists (select 1 from t t2 where t2.id = t.id and t2.start < t.start) 
    ); 

這涵蓋了您的問題的可能性。我不確定它是否涵蓋所有可能性。