2016-04-20 4 views
1

Я знаю, что есть много примеров этого, но до сих пор не удается найти точное решение.Зазоры пробелов и островов/сброс числа строк на основе столбца seqeunce

Я ищу, чтобы сбросить количество строк на основе последовательностей 1s и 0s.

DECLARE @TestTable TABLE (category INT, ts INT,window int) 
INSERT INTO @TestTable (category,ts,window) 
VALUES (1,1,1),(1,2,1),(1,3,0),(1,4,0),(1,5,1),(1,6,1),(1,7,1),(2,1,0),(2,2,1),(2,3,1),(2,4,1),(2,5,0),(2,6,0),(2,7,1),(2,8,1),(2,9,1),(2,10,1),(2,11,1) 

enter image description here

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

Лучшие У меня до сих пор:

SELECT 
    x.category, 
    ts, 
    window, 
    is_group, 
    SUM(is_group) OVER (PARTITION BY x.category ORDER BY ts ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING) * is_group 
FROM 
    (
    SELECT 
     *, 
     CASE WHEN LAG(window) OVER(PARTITION BY category ORDER BY ts ) = window THEN 1 ELSE 0 END is_group 
    FROM @TestTable 
    ) x 
ORDER BY x.category,ts 

Это почти работает, но для последнего участка не будет увеличивать число строк дальше, чем 2:

enter image description here

ответ

2

Что-то вроде этого?

DECLARE @TestTable TABLE (category INT, ts INT,window int) 
INSERT INTO @TestTable (category,ts,window) 
VALUES (1,1,1),(1,2,1),(1,3,0),(1,4,0),(1,5,1),(1,6,1),(1,7,1),(2,1,0),(2,2,1),(2,3,1),(2,4,1),(2,5,0),(2,6,0),(2,7,1),(2,8,1),(2,9,1),(2,10,1),(2,11,1); 


with ctex 
as 
(
SELECT 
x.category, 
ts, 
window, 
is_group, 
sum(is_group) over (partition by category order by ts) as groupstot 


FROM 
(
SELECT 
    *, 
    CASE WHEN LAG(window) OVER(PARTITION BY category ORDER BY ts ) = window THEN 0 ELSE 1 END is_group 
FROM @TestTable 
) x 

) 
Select * , row_number() over(partition by category,groupstot order by ts) from ctex 
ORDER BY category,ts 
+0

Отлично, что сделал. благодаря –