Счетчик SQL сбрасывается, когда двоичный столбец равен 0 - PullRequest
0 голосов
/ 02 октября 2019

У меня есть образец таблицы ниже. Я пытаюсь создать счетчик, который сбрасывается, когда Flag равен 0 без рекурсивной таблицы.

Animal  Order  Flag
Cat     1      0
Cat     2      0
Cat     3      1
cat     4      1
cat     5      0
cat     6      1
cat     7      1
Dog     1      0
Dog     2      1
Dog     3      1
Dog     4      1
Dog     5      0
Dog     6      0
Dog     7      1

Я пробовал различные row_number, rank, dense_rank, но ничего не получилосья близко. Самое близкое, что я получил, - это использование метода отставания, приведенного ниже, но он может рассчитывать только до 2 и должен иметь возможность считать до бесконечности.

Lag: MAX(flag ) OVER(PARTITION BY 1 ORDER BY Order ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)

Желаемый выход

Animal  Order  Flag  Count
Cat     1      0     0
Cat     2      0     0
Cat     3      1     1
cat     4      1     2
cat     5      0     0
cat     6      1     1
cat     7      1     2
Dog     1      0     0
Dog     2      1     1
Dog     3      1     2
Dog     4      1     3
Dog     5      0     0
Dog     6      0     0
Dog     7      1     1

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Вы также можете сделать это, используя RESET WHEN, который является расширением Teradata:

SELECT animal, order, flag,
  SUM(flag) OVER(
    PARTITION BY animal -- Group by animals
    ORDER BY order
    RESET WHEN flag = 0 -- Reset count to 0
    ROWS UNBOUNDED PRECEDING -- Cumulative count
  ) AS count 
FROM mytable

У меня нет системы TD для тестирования, но попробуйте и дайте мне знать.

Пример

0 голосов
/ 02 октября 2019

Назначьте grouping для каждой строки. Затем используйте row_number():

select t.*,
       (case when flag = 0 then 0
             else row_number() over (partition by animal, grouping order by order) - 1
        end) as count
from (select t.*,
             sum(case when flag = 0 then 1 else 0 end) over
                 (partition by animal
                  order by order
                  rows between unbounded preceding and current row
                 ) as grouping
      from t
     ) t

- 1, потому что каждая последовательность 1 также включает в себя предыдущий 0. Вы также можете выразить это как:

             else row_number() over (partition by animal, grouping, flag order by order)

, поэтому в группу входят только 1.

...