Укажите количество раз, когда столбец изменил значение, основанное на текущих и предыдущих строках

89
6

У меня есть следующий набор результатов.

Product  Date       Status    
123 1/1/2017 Active
123 2/1/2017 Inactive
123 3/1/2017 Active
456 1/1/2017 Active
456 1/2/2017 Active
456 1/3/2017 Inactive
789 1/7/2017 Active
789 1/15/2017 Active
789 1/21/2017 Active
111 1/7/2017 Inactive
111 1/15/2017 Active
111 1/21/2017 Inactive
111 1/23/2017 Active
111 1/31/2017 Inactive

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

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

Желаемые результаты будут выглядеть так:

Product  Date       Status    # of Distinct Status  # of Status Change
123 1/1/2017 Active 1 0
123 2/1/2017 Inactive 2 1
123 3/1/2017 Active 2 2
456 1/1/2017 Active 1 0
456 1/2/2017 Active 1 0
456 1/3/2017 Inactive 2 1
789 1/7/2017 Active 1 0
789 1/15/2017 Active 1 0
789 1/21/2017 Active 1 0
111 1/7/2017 Inactive 1 0
111 1/15/2017 Active 2 1
111 1/21/2017 Inactive 2 2
111 1/23/2017 Active 2 3
111 1/31/2017 Inactive 2 4

спросил(а) 2018-01-09T23:50:00+03:00 2 года, 8 месяцев назад
1
Решение
92

Вы можете сделать это с помощью функций lag и sum

select id,date,status,
sum(case when prev_status is null or prev_status=status then 0 else 1 end) over(partition by product order by date) as num_of_status_change
from (select id,date,status,lag(status) over(partition by product order by date) as prev_status
from tbl
) t

ответил(а) 2018-01-10T00:02:00+03:00 2 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема