Comptage des lignes consécutives – SQL Server 2008

J'ai besoin de countr les lignes consécutives basées sur la valeur dans l'autre colonne.

Je suis totalement novice quand il s'agit de SQL – alors requestz si quelque chose n'est pas clair.

J'ai SQL Server 2008, donc LEAD() et LAG() n'entrent pas en jeu, même avec OVER () avec la taille de la window base sur la partition.

Exemple de jeu de données:

 SLOT Blocked ------------------------------- 2015-02-09 07:00:00.000 0 2015-02-09 07:15:00.000 0 2015-02-09 07:30:00.000 0 2015-02-09 07:45:00.000 1 2015-02-09 08:00:00.000 1 2015-02-09 08:15:00.000 1 2015-02-09 08:30:00.000 0 2015-02-09 08:45:00.000 0 2015-02-09 09:00:00.000 0 2015-02-09 09:15:00.000 0 2015-02-09 09:30:00.000 1 2015-02-09 09:45:00.000 1 2015-02-09 10:00:00.000 1 2015-02-09 10:15:00.000 1 2015-02-09 10:30:00.000 0 2015-02-09 10:45:00.000 0 2015-02-09 11:00:00.000 0 2015-02-09 11:15:00.000 0 2015-02-09 11:30:00.000 0 2015-02-09 11:45:00.000 0 2015-02-09 12:00:00.000 0 

Les données sont classées par SLOT . Je voudrais countr les lignes sur les partitions where Blocked = 0 .

Le résultat que je voudrais get:

 SLOT Blocked RowNum ------------------------------------------- 2015-02-09 07:00:00.000 0 1 2015-02-09 07:15:00.000 0 2 2015-02-09 07:30:00.000 0 3 2015-02-09 07:45:00.000 1 0 2015-02-09 08:00:00.000 1 0 2015-02-09 08:15:00.000 1 0 2015-02-09 08:30:00.000 0 1 2015-02-09 08:45:00.000 0 2 2015-02-09 09:00:00.000 0 3 2015-02-09 09:15:00.000 0 4 2015-02-09 09:30:00.000 1 0 2015-02-09 09:45:00.000 1 0 2015-02-09 10:00:00.000 1 0 2015-02-09 10:15:00.000 1 0 2015-02-09 10:30:00.000 0 1 2015-02-09 10:45:00.000 0 2 2015-02-09 11:00:00.000 0 3 2015-02-09 11:15:00.000 0 4 2015-02-09 11:30:00.000 0 5 2015-02-09 11:45:00.000 0 6 2015-02-09 12:00:00.000 0 7 

Merci d'avance!

Pour SQL Server 2008, vous pouvez le résoudre comme ça

 SELECT Slot ,Blocked ,CASE WHEN Blocked = 0 THEN ROW_NUMBER() OVER (PARTITION BY rt.RunningTotal ORDER BY Slot) ELSE 0 END RowNum FROM Table1 t CROSS APPLY (SELECT ISNULL(SUM(Blocked), 0) RunningTotal FROM Table1 WHERE Slot < t.Slot ) rt ORDER BY Slot 

(Remplacez Table1 par le nom de votre table)

SQL Fiddle: http://sqlfiddle.com/#!3/659a0/28

Puisque vous utilisez sqlserver 2008, vous devez utiliser row_number (). Le calcul est un peu complexe, mais ce script fonctionnera à partir de sqlserver 2005.

 ;WITH CTE AS ( SELECT SLOT, row_number() over (order by SLOT)- row_number() over (partition by blocked order by SLOT) x, blocked FROM -- replace these lines with your real table --start test tabel (values (cast( '2015-02-09 07:00:00.000' as datetime), 0) ,('2015-02-09 07:15:00.000', 0),('2015-02-09 07:30:00.000', 0) ,('2015-02-09 07:45:00.000', 1),('2015-02-09 08:00:00.000', 1) ,('2015-02-09 08:15:00.000', 1),('2015-02-09 08:30:00.000', 0) ,('2015-02-09 08:45:00.000', 0),('2015-02-09 09:00:00.000', 0) ,('2015-02-09 09:15:00.000', 0),('2015-02-09 09:30:00.000', 1) ,('2015-02-09 09:45:00.000', 1),('2015-02-09 10:00:00.000', 1) ,('2015-02-09 10:15:00.000', 1),('2015-02-09 10:30:00.000', 0) ,('2015-02-09 10:45:00.000', 0),('2015-02-09 11:00:00.000', 0) ,('2015-02-09 11:15:00.000', 0),('2015-02-09 11:30:00.000', 0) ,('2015-02-09 11:45:00.000', 0),('2015-02-09 12:00:00.000', 0)) x(SLOT,Blocked ) -- end test tabel ) SELECT SLOT, BLOCKED, CASE WHEN blocked = 0 THEN row_number() over (partition by x, blocked order by slot) ELSE 0 end ROWNUMBER FROM cte ORDER BY slot 

Question interessante..!!

J'ai été en mesure d'y parvenir en utilisant le code ci-dessous:

  CREATE TABLE #TestTable(SLOT DATETIME,BLOCKED INT); INSERT #TestTable(SLOT,BLOCKED) VALUES ('2015-02-09 07:00:00.000' ,0), ('2015-02-09 07:15:00.000' ,0), ('2015-02-09 07:30:00.000' ,0), ('2015-02-09 07:45:00.000' ,1), ('2015-02-09 08:00:00.000' ,1), ('2015-02-09 08:15:00.000' ,1), ('2015-02-09 08:30:00.000' ,0), ('2015-02-09 08:45:00.000' ,0), ('2015-02-09 09:00:00.000' ,0), ('2015-02-09 09:15:00.000' ,0), ('2015-02-09 09:30:00.000' ,1), ('2015-02-09 09:45:00.000' ,1), ('2015-02-09 10:00:00.000' ,1), ('2015-02-09 10:15:00.000' ,1), ('2015-02-09 10:30:00.000' ,0), ('2015-02-09 10:45:00.000' ,0), ('2015-02-09 11:00:00.000' ,0), ('2015-02-09 11:15:00.000' ,0), ('2015-02-09 11:30:00.000' ,0), ('2015-02-09 11:45:00.000' ,0), ('2015-02-09 12:00:00.000' ,0) SELECT * FROM #TestTable ORDER BY SLOT ;WITH TestTableVw AS (SELECT SLOT,BLOCKED,ROW_NUMBER() OVER(ORDER BY SLOT) RNum FROM #TestTable ) SELECT T.SLOT,T.BLOCKED,CASE WHEN T.BLOCKED=0 THEN V1.RNum-ISNULL((SELECT MAX(V2.RNum) FROM TestTableVw V2 WHERE V2.RNum<V1.RNum AND V2.BLOCKED=1),0) ELSE 0 END FROM #TestTable T JOIN TestTableVw V1 ON T.SLOT=V1.SLOT DROP TABLE #TestTable; 

J'espère que cela aidera .. !!

Merci,

Swapnil