按分区标记前面的行
Labeling preceding rows by partition
我需要标记值不同并按日期排序的前几行。我已尝试将 row_number() 与分区一起使用,但我没有返回预期的结果。
Table:
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
看看哪里有变化,然后总结一下
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;
我需要标记值不同并按日期排序的前几行。我已尝试将 row_number() 与分区一起使用,但我没有返回预期的结果。
Table:
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
看看哪里有变化,然后总结一下
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;