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
相关产品推荐
相关产品推荐

