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

SQL基于3列值筛选记录:获取所有TYPE1及对应最新TYPE2记录

SQL查询解决方案

需求核心规则

  • 保留所有Types字段值为TYPE 1的记录
  • 按User字段分组后,每一段连续TYPE1记录对应的后续TYPE2记录中,取Row2#值最大的一条TYPE2记录保留(使用Row2#比日期计算更简便,无类型转换开销)

实现代码(兼容SQL Server,其他数据库可微调语法适配)

WITH SessionGroupCTE AS (
    -- 计算会话分组:遇到TYPE1时分组编号+1,同分组包含一段TYPE1和其后续所有TYPE2
    SELECT *,
           SUM(CASE WHEN Types = 'TYPE 1' THEN 1 ELSE 0 END) 
           OVER (PARTITION BY [User] ORDER BY [Row#] ROWS UNBOUNDED PRECEDING) AS SessionGrp
    FROM MyTable
),
Type2RankCTE AS (
    -- 给同一会话分组内的TYPE2按Row2#倒序排名,第一名为最大Row2#的记录
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY [User], SessionGrp ORDER BY [Row2#] DESC) AS Type2Ranking
    FROM SessionGroupCTE
)
-- 筛选结果:所有TYPE1 + 每个分组排名第一的TYPE2
SELECT ID, [User], [Row#], [Row2#], Types, [Date]
FROM Type2RankCTE
WHERE Types = 'TYPE 1' 
   OR (Types = 'TYPE 2' AND Type2Ranking = 1)
ORDER BY [User], [Row#]

逻辑说明

  1. 会话分组计算:通过累计求和的开窗函数,给同一个用户下的记录打分组标记,每出现一次TYPE1就进入新的分组,确保同一个分组内包含一段连续的TYPE1记录,和这段TYPE1之后所有连续的TYPE2记录
  2. TYPE2排名:给每个会话分组内的TYPE2记录按Row2#倒序排序,排名第一的就是当前分组内Row2#最大的TYPE2记录
  3. 结果筛选:保留所有TYPE1记录,再加上每个分组排名第一的TYPE2记录,最终输出结果和你给出的示例完全匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:30:06