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

DB2查询:获取每个ID的最早告警时间及对应收件人

DB2 SQL解决方案:获取每个ID最早告警记录的收件人

针对你的需求,这里提供两种可行的DB2 SQL写法,解决GROUP BY无法包含SENDTO的问题:

方法一:使用ROW_NUMBER()窗口函数(推荐)

这种方法能精准定位每个ID最早CREATEDATE对应的那条记录,即使同一ID存在多条相同最早时间的记录,也能按规则取其中一条(如需调整规则可修改排序条件)。

SELECT ID, CREATEDATE, SENDTO
FROM (
    SELECT 
        ID,
        CREATEDATE,
        SENDTO,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY CREATEDATE ASC) AS rn
    FROM M.LOG
    WHERE 
        SENDER = 'alerta@vomcoo.com'
        AND SUBJECT = 'ALERTA - SLA estourado'
        -- 测试时可加上ID过滤:AND ID = 4355070
) AS temp
WHERE rn = 1;

逻辑说明:

  • 内层查询用PARTITION BY ID按ID分组,ORDER BY CREATEDATE ASC让每个组内的记录按时间从早到晚排序
  • ROW_NUMBER()给每个组内的记录编号,最早的记录编号为1
  • 外层查询筛选出编号为1的记录,就是每个ID最早告警的那条,同时保留对应的SENDTO

方法二:关联子查询

先找出每个ID的最小CREATEDATE,再关联原表获取对应的SENDTO。注意:如果同一ID和最小CREATEDATE对应多条记录,会返回所有匹配的记录,可根据需求添加聚合函数(比如MIN(SENDTO))去重。

SELECT l.ID, l.CREATEDATE, l.SENDTO
FROM M.LOG l
INNER JOIN (
    SELECT ID, MIN(CREATEDATE) AS MIN_CREATEDATE
    FROM M.LOG
    WHERE 
        SENDER = 'alerta@vomcoo.com'
        AND SUBJECT = 'ALERTA - SLA estourado'
        -- 测试时可加上ID过滤:AND ID = 4355070
    GROUP BY ID
) AS min_dates ON l.ID = min_dates.ID AND l.CREATEDATE = min_dates.MIN_CREATEDATE
WHERE 
    l.SENDER = 'alerta@vomcoo.com'
    AND l.SUBJECT = 'ALERTA - SLA estourado';

逻辑说明:

  • 子查询先按ID分组,计算每个ID的最小CREATEDATE
  • 原表和子查询关联,匹配ID和最小时间,从而拿到对应的SENDTO

内容的提问来源于stack exchange,提问作者Douglas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:56:00