Filter rows in a table with the gap between the values SQL SERVER -
i have big blocking problem. trying filter rows of table based on gap between dates. let me explain, has table sorted emetteur , date :
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
i trying select unique rows gap greater 5h, see in picture
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 have 4 rows, selected rows 2 , 4 beacause gap greater 5.
to solve problem thought had set table tmp resort inserted line line , achque time check issuer, date difference between line , insert line in destination table lower has 5 hours update or insert line.
this solution long because data exceed filter 3000000 online
you can express query using lag()
, unfortunately, not available in sql server 2008.
the following query want:
select t.* table t cross apply (select top 1 t2.* table t2 t2.emetteur = t.emetteur , t2.date < t.date ) tprev t.date > dateadd(hour, 5, tprev.date);
for performance, best index on (emetteur, date)
.
however, if need performance type of query, might need store previous/next value in records (using trigger/stored procedure on inserts). or, might consider upgrading sql server 2012/2014, support lag()
, should bit more optimized.
in sql server 2012+, use:
select t.* (select t.*, lag(date) on (partition emetteur order bydate) prev_date table t ) t t.date > dateadd(hour, 5, prev_date);
Comments
Post a Comment