Une alternative à un slider pour ce process?

J'ai une table qui a des loggings dans ce format:

SPECIAL_ID | OTHER_ID | NAME | TIMESTAMP 

J'ai besoin de créer une nouvelle table basée sur cela, mais seulement get des loggings qui sont au less 25 minutes d'intervalle de la précédente. Les intervalles ne sont pas cohérents. Donc, si je commence par l'logging 1, je dois get l'logging suivant qui est au less à 25 minutes de l'horodatage de l'logging 1. Ce sera l'logging 2 dans la nouvelle table. Et puis le prochain logging qui est 25 minutes après le précédent qui a été extrait. Donc, voici un exemple d'info:

 AAA | 1 | WHATEVER2 | 2016-11-20 00:00:00 BCD | 2 | WHATEVER00 | 2016-11-20 00:02:00 AAA | 3 | WHATEVER01 | 2016-11-20 00:09:00 AAA | 4 | WHATEVER55 | 2016-11-20 00:20:00 XYZ | 5 | WHATEVER | 2016-11-20 00:24:00 AAA | 6 | WHATEVER11 | 2016-11-20 00:45:00 QRS | 7 | WHATEVER | 2016-11-20 00:46:00 QRS | 8 | WHATEVER12 | 2016-11-20 00:59:00 AAA | 9 | WHATEVER12 | 2016-11-20 01:02:00 AAA |10 | WHATEVER12 | 2016-11-20 01:17:00 

Et ce que j'essaie de faire:

 AAA | 1 | WHATEVER2 | 2016-11-20 00:00:00 AAA | 6 | WHATEVER11 | 2016-11-20 00:45:00 AAA |10 | WHATEVER12 | 2016-11-20 01:17:00 

J'ai réussi à utiliser un slider et l'ai testé sur un petit set d'loggings. Cela a fonctionné … mais j'ai des millions d'loggings qui doivent être analysés de cette manière. Un slider ne fait que requestr des ennuis, semble-t-il.

Y a-t-il une meilleure manière de faire cela?

Je suis bloqué avec SQL Server 2008, donc lead() et lag() est hors de question.

Toute aide grandement appréciée.

Cela pourrait être une solution possible (coûteuse en termes de calcul) pour Sql Server 2008:

Dans la première étape, les premiers loggings sont déterminés. À la deuxième étape, la requête détermine les loggings de 25 minutes les plus proches pour chaque logging existant. Par la suite (étape 3), les loggings de données sont réduits à celui avec le plus petit OTHER_ID. Bien sûr, cela ne fonctionne que si le champ avec le OTHER_ID unique et augmente de manière synchrone avec l'heure. Pour des millions d'loggings, les champs utilisés dans la requête doivent être indexés et la search restreinte.

 -- test script SET dateformat ymd ;WITH testdata AS ( SELECT 'AAA' AS SPECIAL_ID, 1 AS OTHER_ID, 'WHATEVER2' AS NAME , CONVERT(DATETIME, '2016-11-20 00:00:00') AS [TIMESTAMP] UNION SELECT 'BCD' , 2 , 'WHATEVER00' , CONVERT(DATETIME, '2016-11-20 00:02:00') UNION SELECT 'AAA' , 3 , 'WHATEVER01' , CONVERT(DATETIME, '2016-11-20 00:02:01') UNION SELECT 'AAA' , 4 , 'WHATEVER55' , CONVERT(DATETIME, '2016-11-20 00:20:00') UNION SELECT 'XYZ' , 5 , 'WHATEVER' , CONVERT(DATETIME, '2016-11-20 00:24:00') UNION SELECT 'AAA' , 6 , 'WHATEVER11' , CONVERT(DATETIME, '2016-11-20 00:45:00') UNION SELECT 'QRS' , 7 , 'WHATEVER' , CONVERT(DATETIME, '2016-11-20 00:46:00') UNION SELECT 'QRS' , 8 , 'WHATEVER12' , CONVERT(DATETIME, '2016-11-20 00:59:00') UNION SELECT 'AAA' , 9 , 'WHATEVER12' , CONVERT(DATETIME, '2016-11-20 01:02:00') UNION SELECT 'AAA' ,10 , 'WHATEVER12' , CONVERT(DATETIME, '2016-11-20 01:17:00') UNION SELECT 'QRS' ,11 , 'WHATEVER13' , CONVERT(DATETIME, '2016-11-20 01:30:00') ), firstRecord AS ( SELECT SPECIAL_ID, MIN(OTHER_ID) AS OTHER_ID FROM testdata GROUP BY SPECIAL_ID ), nextRecord1 AS ( SELECT I1.SPECIAL_ID, I1.OTHER_ID AS OTHER_ID, MIN(I2.OTHER_ID) AS next_OTHER_ID FROM testdata I1 INNER JOIN testdata I2 ON I1.SPECIAL_ID = I2.SPECIAL_ID AND I1.OTHER_ID < I2.OTHER_ID AND I2.[TIMESTAMP] >= DATEADD(minute, 25, I1.[TIMESTAMP]) GROUP BY I1.SPECIAL_ID, I1.OTHER_ID ), nextRecord2 AS ( SELECT SPECIAL_ID, MIN(OTHER_ID) AS OTHER_ID, next_OTHER_ID FROM nextRecord1 GROUP BY SPECIAL_ID, next_OTHER_ID ) SELECT T2.* FROM firstRecord T1 INNER JOIN testdata T2 ON T1.OTHER_ID = T2.OTHER_ID UNION SELECT T2.* FROM nextRecord2 T1 INNER JOIN testdata T2 ON T1.next_OTHER_ID = T2.OTHER_ID