Compter les loggings Exept plus de 'N' Valeurs de Consecutinve

J'ai une table qui a un record de vitesse par seconde pour un véhicule. Si le véhicule est arrêté, la colonne de speed aura la valeur 0. J'ai besoin de countr le time en mouvement pour le véhicule.

Conditions:

  1. Si le véhicule est arrêté pendant 3 secondes ou plus, il sera traité comme STOPPEDTIME
  2. Si le véhicule est arrêté pendant less de 3 secondes, il sera traité comme MOVEMENTTIME

J'ai déjà un slider qui calcule cette valeur mais je veux supprimer l'utilisation du slider et optimiser la requête.

Données d'échantillon:

 create table Vehicle(Timer datetime,Speed int) insert into Vehicle values ('1-Jan-2015 00:00:01',10) insert into Vehicle values ('1-Jan-2015 00:00:02',14) insert into Vehicle values ('1-Jan-2015 00:00:03',15) insert into Vehicle values ('1-Jan-2015 00:00:04',14) insert into Vehicle values ('1-Jan-2015 00:00:05',16) insert into Vehicle values ('1-Jan-2015 00:00:06',0) -- do not count (3 consecutive) insert into Vehicle values ('1-Jan-2015 00:00:07',0) -- do not count (3 consecutive) insert into Vehicle values ('1-Jan-2015 00:00:08',0) -- do not count (3 consecutive) insert into Vehicle values ('1-Jan-2015 00:00:09',4) insert into Vehicle values ('1-Jan-2015 00:00:10',5) insert into Vehicle values ('1-Jan-2015 00:00:11',5) insert into Vehicle values ('1-Jan-2015 00:00:12',0) insert into Vehicle values ('1-Jan-2015 00:00:13',0) insert into Vehicle values ('1-Jan-2015 00:00:14',14) insert into Vehicle values ('1-Jan-2015 00:00:15',15) insert into Vehicle values ('1-Jan-2015 00:00:16',0)-- do not count (4 consecutive) insert into Vehicle values ('1-Jan-2015 00:00:17',0)-- do not count (4 consecutive) insert into Vehicle values ('1-Jan-2015 00:00:18',0)-- do not count (4 consecutive) insert into Vehicle values ('1-Jan-2015 00:00:19',0)-- do not count (4 consecutive) insert into Vehicle values ('1-Jan-2015 00:00:20',10) insert into Vehicle values ('1-Jan-2015 00:00:21',12) -- select * from Vehicle 

Résultat

 MOVEMENTTIME (in Seconds) -------------------- 14 

En utilisant ROW_NUMBER :

SQL Fiddle

 ;WITH Cte AS( SELECT *, RN = ROW_NUMBER() OVER(ORDER BY Timer) - ROW_NUMBER() OVER( PARTITION BY CASE WHEN Speed > 0 THEN 1 ELSE 0 END ORDER BY Timer ) FROM Vehicle ), CteCnt AS( SELECT RN,Speed, cnt = COUNT(*) FROM Cte GROUP BY RN, Speed ) SELECT SUM(cnt) FROM CteCnt WHERE Speed > 0 OR (Speed = 0 AND cnt < 3)