SQL实现需求:按column2、column3分组,获取符合条件的column4最大值行
复杂分组筛选SQL实现
需求说明
对数据按以下规则筛选:
- 以
column2和column3为一级分组 - 每个一级分组内,再按
column4划分子组:- 在每个
column4子组中,先取column5值最大的行;如果该行的column1为0,则排除所有column1=0的行后,取剩余行里column5最大的那一行
- 在每个
- 从每个一级分组下各
column4子组筛选出的行中,最终选取column4值最大的那一行
示例数据
column1 column2 column3 column4 column5 12 1 A1 1 1 0 1 A1 1 2 18 1 A1 1 3 20 1 A1 2 1 23 1 A1 2 2 4 1 B1 1 1 7 1 B1 1 2 12 1 B1 1 3 17 1 B1 2 1 0 1 B1 2 2 13 2 A1 1 1 25 2 A1 1 2 24 2 A1 1 3 25 2 A1 2 1 0 2 A1 2 2 13 2 B1 1 1 0 2 B1 1 2 24 2 B1 1 3 25 2 B1 2 1 0 2 B1 2 2 7 3 A1 1 1 10 3 A1 1 2 14 3 A1 1 3 15 3 A1 2 1 18 3 A1 2 2 7 3 B1 1 1 10 3 B1 1 2 14 3 B1 1 3 15 3 B1 2 1 18 3 B1 2 2
期望结果
column1 column2 column3 column4 column5 23 1 A1 2 2 17 1 B1 2 1 25 2 A1 2 1 25 2 B1 2 1 18 3 A1 2 2 18 3 B1 2 2
SQL实现
通过多层窗口函数分层处理,实现逻辑如下:
WITH step1 AS ( -- 给每个column4子组的行排序:优先排除column1=0的行,再按column5降序 SELECT *, ROW_NUMBER() OVER ( PARTITION BY column2, column3, column4 ORDER BY CASE WHEN column1 = 0 THEN 1 ELSE 0 END, column5 DESC ) AS rn FROM your_table_name ), step2 AS ( -- 提取每个column4子组中符合要求的行(rn=1即为目标行) SELECT * FROM step1 WHERE rn = 1 ), step3 AS ( -- 在column2+column3分组内,按column4降序排序,标记最终候选行 SELECT *, ROW_NUMBER() OVER ( PARTITION BY column2, column3 ORDER BY column4 DESC ) AS final_rn FROM step2 ) -- 筛选出最终结果 SELECT column1, column2, column3, column4, column5 FROM step3 WHERE final_rn = 1 ORDER BY column2, column3;
逻辑拆解
- step1:针对
column2+column3+column4的分组,先将column1=0的行排至末尾,再按column5从大到小排序,用ROW_NUMBER()标记顺序。rn=1的行就是该子组内符合要求的行(要么是最大column5且column1≠0,要么是排除0值行后最大的column5)。 - step2:提取每个
column4子组中rn=1的行,得到各子组的筛选结果。 - step3:在
column2+column3的分组内,按column4从大到小排序,标记顺序后取final_rn=1的行,即为最终需要的结果。
内容的提问来源于stack exchange,提问作者BabaBoy
相关产品推荐
相关产品推荐

