2015-06-13 31 views
0

我有一個很大的阻塞問題。 我想基於日期之間的差距篩選表的行。 讓我解釋一下,我已經通過EMETTEUR和日期排序像這樣的表:在表中用值之間的差距過濾行SQL SERVER

EMETTEUR | DATE 
---------------------------- 
E1  | 13/06/2015 10:01 
E1  | 13/06/2015 10:30 
E1  | 13/06/2015 16:01 
E1  | 13/06/2015 17:01 
E2  | 14/06/2015 08:01 
E2  | 15/06/2015 14:01 
E3  | 15/06/2015 09:01 
E3  | 15/06/2015 15:01 
E3  | 15/06/2015 22:23 
E4  | 12/06/2015 12:01 
E4  | 12/06/2015 14:11 
E4  | 12/06/2015 14:22 
E5  | 15/06/2015 13:01 
E5  | 15/06/2015 14:13 
E6  | 11/06/2015 19:01 

我想選擇唯一行,其中的差距比5H更大,因爲你在這張照片看到

EMETTEUR | DATE 
---------------------------- 
E1  | 13/06/2015 10:30 
E1  | 13/06/2015 17:01 
E2  | 14/06/2015 08:01 
E2  | 15/06/2015 14:01 
E3  | 15/06/2015 09:01 
E3  | 15/06/2015 15:01 
E3  | 15/06/2015 22:23 
E4  | 12/06/2015 14:22 
E5  | 15/06/2015 14:13 
E6  | 11/06/2015 19:01 

FOR EMETTEUR E1我們有4行,我們選擇的行2和4東陽的間隙大於5

來解決這個問題,我認爲已經建立了其中I由線和achque時間插入線另一個表TMP景區我向發行人查詢,日期不同補間行並在目標表中插入行較低有5個小時,所以我做了更新或者插入行。

該解決方案是太久的緣故,我會超過過濾3000000在線

數據

回答

0

您可以表達使用lag()查詢,但不幸的是,這不是在SQL Server 2008中

以下查詢可用你想要做什麼:

select t.* 
from table t cross apply 
    (select top 1 t2.* 
     from table t2 
     where t2.emetteur = t.emetteur and 
      t2.date < t.date 
    ) tprev 
where t.date > dateadd(hour, 5, tprev.date); 

出於性能考慮,最好的指數上(emetteur, date)。但是,如果您需要此類查詢的性能,則可能需要在記錄中存儲上一個/下一個值(使用插入時的觸發器/存儲過程)。或者,您可以考慮升級到支持lag()的SQL Server 2012/2014,並且應該更加優化一些。

在SQL Server 2012+,你可以使用:

select t.* 
from (select t.*, lag(date) over (partition by emetteur order bydate) as prev_date 
     from table t 
    ) t 
where t.date > dateadd(hour, 5, prev_date);