sql - 按分区标记前面的行
问题描述
我需要标记值不同并按日期排序的前行。我曾尝试将 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
解决方案
看看哪里有变化,总结一下
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;
推荐阅读
- reactjs - Gatsby、GraphQL 和 Apollo 缓存问题
- java - 如何强制 HttpURLConnection 请求等待完整响应?
- c++ - 如何将 Lambda 函数作为参数传递
- c# - 由于更改消息属性,带有 AzureStorageQueues 的 NServiceBus 不会从输入队列中删除有害消息
- spring - 启动 spring/angular web 应用程序时,我应该选择哪个 t3 EC2 实例作为开始?
- python - 编辑数组中的每个元素以返回一个已编辑(切片)元素的数组
- sql - 什么是 PostgreSQL 等价于 Oracle `like lower(q'$%string%$')`
- storybook - 如何在故事书中使用“selectedPanel”?
- php - 如何在 Laravel 刀片中正确地从我的数组中获取字段的索引?
- c# - Picturebox,设置和获取属性以获取图像抛出空 C#