2015-06-13 22 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);