Redshift SQL:筛选匹配event_id等字段组中value最小的行
保留每组重复行中value最小行的SQL方案
针对你描述的需求——按event_id、alert_id、alert_timestamp分组,每组保留value最小的行,无重复的行直接保留,最通用高效的方法是使用窗口函数:
通用实现(支持绝大多数现代数据库:MySQL 8.0+、PostgreSQL、SQL Server、BigQuery等)
WITH ranked_records AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY event_id, alert_id, alert_timestamp ORDER BY value ASC ) AS row_rank FROM your_table ) SELECT event_id, alert_id, alert_timestamp, value -- 替换为你需要保留的所有列名 FROM ranked_records WHERE row_rank = 1;
逻辑说明
PARTITION BY event_id, alert_id, alert_timestamp:将三个字段完全匹配的行划分为同一组ORDER BY value ASC:让每组内的行按value从小到大排序,最小的value会排在第一位ROW_NUMBER():给每组内的行分配唯一序号,value最小的行序号为1- 最后筛选
row_rank = 1的行,即可得到每组的目标行,无重复的单行自身为一组,自然会被保留
兼容旧版数据库的子查询写法
如果你的数据库不支持CTE(比如MySQL 5.x),可以改用子查询:
SELECT event_id, alert_id, alert_timestamp, value FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY event_id, alert_id, alert_timestamp ORDER BY value ASC ) AS row_rank FROM your_table ) AS ranked WHERE ranked.row_rank = 1;
特殊情况处理
- 若
value存在NULL值,且希望将NULL视为最大(不优先保留),可以修改排序规则:ORDER BY value ASC NULLS LAST - 若需要保留所有
value为最小值的行(比如同一组内有多个行value相同且都是最小),将ROW_NUMBER()替换为RANK()即可。
内容的提问来源于stack exchange,提问作者Ossz
相关产品推荐
相关产品推荐

