You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL查询每个用户最新已取消服务记录(非取消则不返回)

实现需求的SQL查询方案

可以通过ROW_NUMBER()窗口函数配合筛选条件来实现,核心思路是先给每个用户的服务记录按时间倒序排名,再筛选出最新且状态为已取消的记录。

示例SQL代码

假设你的服务记录表名为user_services,关键字段包括:

  • user_id:用户ID
  • status:服务状态(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';

逻辑说明

  1. CTE子查询ranked_services:用ROW_NUMBER()给每个用户的所有服务记录排序,同一用户下,时间越新的记录排名rn越小(最新的是1)。
  2. 主查询筛选:只保留排名为1的记录(即每个用户的最新服务记录),并且该记录的状态是已取消。如果用户的最新记录是活跃状态,这条记录会被过滤掉,不会出现在结果中。

如果你的表中判断记录新旧的字段不是service_created_at,换成实际的时间字段(比如service_end_date)即可,只要保证是按时间倒序排序就行。

内容的提问来源于stack exchange,提问作者paultechguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:30:59