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

SQL如何按指定规则获取Cancelled记录对应的前序非Support有效行

SQL查询问题:查找Cancelled状态对应的最近非Support前置记录

现有查询结果表

你当前已有的SQL返回结果如下:

IDDateDescriptionrn
5342021-01-01 4:03:14NEW1
5342021-01-01 4:03:24Payment2
5342021-01-01 4:04:14Accepted3
5342021-01-01 4:05:23Support4
5342021-01-01 4:05:32Cancelled5
6322021-01-01 4:03:36NEW1
6322021-01-01 4:04:12Payment2
6322021-01-01 4:06:28Support3
6322021-01-01 4:11:23Cancelled4
8442021-01-01 5:03:36NEW1
8442021-01-01 5:04:12Payment2
8442021-01-01 5:06:28Accepted3
8442021-01-01 5:11:23Cancelled4

查询需求

找到所有Description为Cancelled的记录,获取对应同ID的前一条状态记录;如果前一条记录的Description为Support,则继续向前查找最近的非Support状态记录,最终返回匹配的有效行。

预期输出

IDDateDescriptionrn
5342021-01-01 4:04:14Accepted3
6322021-01-01 4:04:12Payment2
8442021-01-01 5:06:28Accepted3

解决方法

方案1:窗口函数法(适用MySQL8.0+、PostgreSQL、Oracle等支持窗口函数的数据库)

WITH original_result AS (
  -- 此处替换为你生成上述结果表的原始SQL语句
  SELECT ID, Date, Description, rn FROM your_table
)
SELECT res.*
FROM original_result res
INNER JOIN (
  SELECT 
    ID,
    MAX(CASE WHEN Description != 'Support' AND rn < cancel_rn THEN rn END) AS target_rn
  FROM (
    SELECT 
      ID,
      rn,
      Description,
      MAX(CASE WHEN Description = 'Cancelled' THEN rn END) OVER (PARTITION BY ID) AS cancel_rn
    FROM original_result
  ) t
  GROUP BY ID
) target_map ON res.ID = target_map.ID AND res.rn = target_map.target_rn;

方案2:自关联法(兼容不支持窗口函数的低版本数据库)

SELECT t1.*
FROM your_original_result t1
INNER JOIN your_original_result t2 
  ON t1.ID = t2.ID 
  AND t1.rn < t2.rn 
  AND t2.Description = 'Cancelled'
  AND t1.Description != 'Support'
GROUP BY t1.ID, t1.Date, t1.Description, t1.rn
HAVING t1.rn = MAX(t1.rn);

以上两种方案执行后均可得到符合要求的预期输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:06:03