PostgreSQL按R_Value降序排序后对连续相同Letter分组取最大值
连续相同Letter分组取最大值SQL实现方案
该需求可以通过标准SQL实现,属于经典的「间隙与岛屿」问题场景,无需额外使用过程式语言或中间表存储。
实现思路
- 用
LAG()窗口函数获取上一行的Letter值,标记出Letter发生切换的行 - 对切换标记做累计求和,生成连续相同Letter的分组ID
- 按分组ID和Letter聚合,取每个分组的R_Value最大值
示例代码(兼容所有支持窗口函数的主流数据库:MySQL 8.0+/PostgreSQL/SQL Server/Oracle)
WITH step1 AS ( SELECT *, -- 标记和上一行Letter不同的行 CASE WHEN LAG(Letter) OVER (ORDER BY R_Value DESC) != Letter THEN 1 ELSE 0 END AS change_flag FROM your_table_name -- 替换为实际表名 ), step2 AS ( SELECT *, -- 累计求和生成组ID SUM(change_flag) OVER (ORDER BY R_Value DESC) AS group_id FROM step1 ) SELECT Letter, MAX(R_Value) AS Max_RValue FROM step2 GROUP BY group_id, Letter ORDER BY group_id;
逻辑说明
每当Letter发生切换时,change_flag会标记为1,累计求和后组ID就会加1,因此所有连续相同Letter的行会被分配到同一个组ID,既可以区分前后两个不同的A分组,也可以正常聚合计算每个分组的最大值,运行上述代码即可得到目标结果集。
内容的提问来源于stack exchange,提问作者user2238704
相关产品推荐
相关产品推荐

