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#]
逻辑说明
- 会话分组计算:通过累计求和的开窗函数,给同一个用户下的记录打分组标记,每出现一次TYPE1就进入新的分组,确保同一个分组内包含一段连续的TYPE1记录,和这段TYPE1之后所有连续的TYPE2记录
- TYPE2排名:给每个会话分组内的TYPE2记录按
Row2#倒序排序,排名第一的就是当前分组内Row2#最大的TYPE2记录 - 结果筛选:保留所有TYPE1记录,再加上每个分组排名第一的TYPE2记录,最终输出结果和你给出的示例完全匹配
内容的提问来源于stack exchange,提问作者Jocast80
相关产品推荐
相关产品推荐

