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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:45:53