Маркировка предыдущих строк разделом - PullRequest
1 голос
/ 22 января 2020

Мне нужно пометить предыдущие строки, где значение отличается и упорядочено по дате. Я пытался использовать row_number () с разделом, но я не возвращаю ожидаемые результаты.

Таблица:

Product ID  Price   validfrom   validto
123         0.9    27/07/2016  10/08/2016
123         0.9    11/08/2016  24/04/2017
123         0.75   25/04/2017  23/10/2017
123         0.75   24/10/2017  24/10/2017
123         0.8    25/10/2017  02/01/2018
123         0.9    03/01/2018  21/03/2019
123         0.9    22/03/2019  17/10/2019
123         0.9    18/10/2019  11/11/2019

Ожидаемые результаты:

Product ID  Price   validfrom   validto    rownum
123         0.9    27/07/2016  10/08/2016   4
123         0.9    11/08/2016  24/04/2017   4
123         0.75   25/04/2017  23/10/2017   3
123         0.75   24/10/2017  24/10/2017   3
123         0.8    25/10/2017  02/01/2018   2
123         0.9    03/01/2018  21/03/2019   1
123         0.9    22/03/2019  17/10/2019   1
123         0.9    18/10/2019  11/11/2019   1

Текущий запрос :

select *,row_number() over (partition by Product ID,Price order by validfrom desc) as rownum
from table

Текущие результаты запроса (неверно):

Product ID  Price   validfrom   validto    rownum
123         0.9    27/07/2016  10/08/2016   5
123         0.9    11/08/2016  24/04/2017   4
123         0.75   25/04/2017  23/10/2017   1
123         0.75   24/10/2017  24/10/2017   1
123         0.8    25/10/2017  02/01/2018   1
123         0.9    03/01/2018  21/03/2019   3
123         0.9    22/03/2019  17/10/2019   2
123         0.9    18/10/2019  11/11/2019   1

1 Ответ

2 голосов
/ 22 января 2020

Посмотрите, где произошли изменения, и подведите итог:

select t.*,
       sum(case when next_price is null or next_price <> price then 1 else 0 end) over (partition by product_id order by validfrom desc) as rownum
from (select t.*,
             lead(price) over (partition by product_id order by validfrom) as next_price
      from t
     ) t;
...