有一张table ticket
包含如下数据:
Id Impact group create_date
------------------------------------------
1 3 ABC 2020-07-28 00:42:00.0
1 2 ABC 2020-07-28 00:45:00.0
1 3 ABC 2020-07-28 00:48:00.0
1 3 ABC 2020-07-28 00:52:00.0
1 3 XYZ 2020-07-28 00:55:00.0
1 3 XYZ 2020-07-28 00:59:00.0
预期结果:
Id Impact group create_date
------------------------------------------
1 3 ABC 2020-07-28 00:42:00.0
1 2 ABC 2020-07-28 00:45:00.0
1 3 ABC 2020-07-28 00:52:00.0
1 3 XYZ 2020-07-28 00:59:00.0
目前,我使用的查询是:
WITH final AS (
SELECT p.*,
ROW_NUMBER() OVER(PARTITION BY p.id,p.group,p.impact
ORDER BY p.create_date desc, p.impact) AS rk
FROM ticket p
)
SELECT f.*
FROM final f
WHERE f.rk = 1
结果是:
Id Impact group create_date
-----------------------------------------
1 2 ABC 2020-07-28 00:45:00.0
1 3 ABC 2020-07-28 00:52:00.0
1 3 XYZ 2020-07-28 00:59:00.0
似乎分区比按值排序优先。有没有其他方法可以达到预期的效果。我正在amazon redshift上运行这些查询。
2条答案
按热度按时间xzlaal3s1#
你好像想要排在哪里
id
/impact
/group
相对于下一行更改。一个简单的方法是看下一个create_date
总体和下一步create_date
为了团队。如果它们相同,则过滤:0yycz8jy2#
你可以用
LEAD()
检查Impact
在行之间更改,只取值将更改的行。