如何编写SQL查询每个用户最新已取消服务记录(非取消则不返回)
实现需求的SQL查询方案
可以通过ROW_NUMBER()窗口函数配合筛选条件来实现,核心思路是先给每个用户的服务记录按时间倒序排名,再筛选出最新且状态为已取消的记录。
示例SQL代码
假设你的服务记录表名为user_services,关键字段包括:
user_id:用户IDstatus:服务状态(cancelled表示已取消,active表示活跃)service_created_at:服务创建/更新时间(用来判断记录的新旧)
WITH ranked_services AS ( SELECT user_id, service_id, status, service_created_at, -- 按用户分组,每个用户的记录按时间倒序排名,最新的排第1 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY service_created_at DESC) AS rn FROM user_services ) SELECT user_id, service_id, status, service_created_at FROM ranked_services -- 只取每个用户的最新记录,且该记录状态为已取消 WHERE rn = 1 AND status = 'cancelled';
逻辑说明
- CTE子查询
ranked_services:用ROW_NUMBER()给每个用户的所有服务记录排序,同一用户下,时间越新的记录排名rn越小(最新的是1)。 - 主查询筛选:只保留排名为1的记录(即每个用户的最新服务记录),并且该记录的状态是已取消。如果用户的最新记录是活跃状态,这条记录会被过滤掉,不会出现在结果中。
如果你的表中判断记录新旧的字段不是service_created_at,换成实际的时间字段(比如service_end_date)即可,只要保证是按时间倒序排序就行。
内容的提问来源于stack exchange,提问作者paultechguy
相关产品推荐
相关产品推荐

