2015-02-11 3 views
1

Мне нужно подсчитать последовательные строки на основе значения в другом столбце.Подсчет строк подряд - SQL Server 2008

Я совершенно новый, когда дело доходит до SQL - так что спросите, если что-то неясно.

У меня есть SQL Server 2008, поэтому LEAD() и LAG() не вступают в игру, то же самое с OVER() с базой размера окна на разделе.

Пример набора данных:

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 

Данные упорядочены по SLOT. Я хотел бы считать строки над разделами where Blocked = 0.

Результирующий набор я хотел бы получить:

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 

Спасибо заранее!

+0

просто продолжить работу с условием случая, как этот случай, когда Blocked = 0, то ROW_NUMBER() OVER (PARTITION BY блокированного ORDER BY блокированных) ELSE 0 END – mohan111

+0

Может быть, я не уточнил, достаточно - после нахождения 1 в столбце «заблокирован» счетчик должен перезагрузиться, как в ожидаемом примере результата. Возможно, мой страшный английский - проблема. – TotallyNewb

+0

будут ли когда-либо пробелы в данных? –

ответ

2

Для SQL Server 2008 вы можете решить, как это

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 

(Заменить Table1 с именем таблицы)

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

+0

кажется, что ваш рябь не работает в первых трех строках. То же самое в вашей скрипке –

+0

Поскольку мое предложение для редактирования было отклонено (???), я пишу его как комментарий: вы должны использовать 'SELECT ISNULL (SUM (Blocked), 0) RunningTotal', чтобы избежать собственного раздела для первой строки, вызванного отсутствие предшествующих строк, а RunningTotal - «null». – flo

+0

@flo, похоже, кто-то другой отклонил предложение о внесении изменений. Теперь я сделал редактирование, это решает проблему. –

3

Поскольку вы используете SQLServer 2008, вам нужно для использования row_number(). Расчет является немного сложным, но этот сценарий будет работать с 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 
0

Интересный вопрос .. !!

мне удалось добиться этого с помощью кода ниже:

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; 

Я надеюсь, что это поможет .. !!

Спасибо,

Swapnil

+0

@TotallyNewb: Проверьте, работает ли код, который я предоставил вам. Я проверил это, используя предоставленные данные образца. Код генерирует ожидаемый результат, как указано в вопросе. – Swapnil

Смежные вопросы