количество значений в sql - PullRequest
1 голос
/ 24 марта 2019

Я хочу отображать количество значений, когда значение изменяется на 0 для текущей записи.

я не очень знаком с sql, пробовал самостоятельное соединение, но dint сработал

см. Входные записи ниже.

Date, value
2018-12, 0
2018-11, 1
2018-10, 1
2018-09, 1
2018-08, 0
2018-07, 0
2018-06, 1
2018-05, 0
2018-04, 1
2018-03, 0
2018-02, 0
2018-01, 1

выходной кожух будет как ниже.

Date, value, Count
2018-12, 0 , 3
2018-11, 1 , 2
2018-10, 1 , 1
2018-09, 1 , 0
2018-08, 0 , 0
2018-07, 0 , 2
2018-06, 1 , 1
2018-05, 1 , 0
2018-04, 0 , 0
2018-03, 0 , 0
2018-02, 0 , 1
2018-01, 1 ,null

для первой записи 2018-12, 0 мы должны отслеживать, когда пришло первое вхождение 0. как только наступило 0, нам нужно остановить отсчет там.

В этом случае 0 пришло 2018-08,0 за первую запись 2018-12, 0.поэтому нам нужно сохранить счет 3 для 2018-12, 0.

Для 2018-11, 1 мы получили 0 после двух значений, поэтому нам нужно сохранить 2.

Для 2018-08,0 мы получили 0 сразу, поэтому 0 нужно сохранить

Для 2018-07, 0 мы получили 0 после двух значений, поэтому нужно продолжать в том же духе.

Я плохо умею писать sql, пожалуйста, помогите, как написать sql для этого сценария.

1 Ответ

1 голос
/ 24 марта 2019

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

Затем в каждой группе вы можете использовать row_number() для расчета:

select t.*,
       (row_number() over (partition by grp order by "Date" asc) - 1) as counter
from (select t.*,
             sum(case when value = 0 then 1 else 0 end) over (order by "Date" desc) as grp
      from t
     ) t
order by "Date" desc;

Я не уверен, почему самое раннее значение будет NULL, поэтому я не включил это в логику.

Здесь - это скрипта db <> (обратите внимание, что здесь используется Postgres, но важный код тот же).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...