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

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -