SQL查询获取对应最早时间的FIELD_NUMERIC_OLD值问题咨询
解决SQL获取最早时间对应字段值的问题
你的原查询因为分组逻辑错误,导致返回了多条无关记录。要获取NAM5344483工单下,最早变更时间对应的FIELD_NUMERIC_OLD值,可采用以下两种方案:
方案一:使用窗口函数(推荐)
利用ROW_NUMBER()按变更时间排序,直接取最早的一条记录:
SELECT MIN_INSTANCE, FIELD_NUMERIC_OLD FROM ( SELECT TRUNC(efc.DATESTAMP) AS MIN_INSTANCE, efc.FIELD_NUMERIC_OLD, -- 按日期升序排序,最早的记录排号为1 ROW_NUMBER() OVER (ORDER BY TRUNC(efc.DATESTAMP) ASC) AS rn FROM EVENT_FIELD_CHANGES efc JOIN SCE.EVENTS_LIST el ON el.EVENT_SEQ = efc.EVENT_SEQ WHERE efc.DESCRIPTION = 'Number of Units Change' AND el.JOB_REFERENCE = 'NAM5344483' ) t WHERE rn = 1;
如果存在多条记录共享同一个最早变更时间,且你需要保留所有这些记录,可将ROW_NUMBER()替换为RANK()。
方案二:子查询关联筛选
先通过子查询找到最早的变更日期,再关联原表获取对应字段值:
SELECT TRUNC(efc.DATESTAMP) AS MIN_INSTANCE, efc.FIELD_NUMERIC_OLD FROM EVENT_FIELD_CHANGES efc JOIN SCE.EVENTS_LIST el ON el.EVENT_SEQ = efc.EVENT_SEQ WHERE efc.DESCRIPTION = 'Number of Units Change' AND el.JOB_REFERENCE = 'NAM5344483' -- 匹配子查询算出的最早日期 AND TRUNC(efc.DATESTAMP) = ( SELECT MIN(TRUNC(DATESTAMP)) FROM EVENT_FIELD_CHANGES efc_sub JOIN SCE.EVENTS_LIST el_sub ON el_sub.EVENT_SEQ = efc_sub.EVENT_SEQ WHERE efc_sub.DESCRIPTION = 'Number of Units Change' AND el_sub.JOB_REFERENCE = 'NAM5344483' );
这种方式会返回所有对应最早日期的记录,适合存在同时间多条变更的场景。
原查询问题说明
你原来的查询中,GROUP BY el.JOB_REFERENCE但SELECT里包含未聚合的efc.FIELD_NUMERIC_OLD,这不符合标准SQL分组规则(部分宽松模式的数据库可能允许,但结果不可控)。最终会返回该工单下所有FIELD_NUMERIC_OLD值,同时每条记录都显示整个分组的最早日期,这就是你看到两行结果的原因。
内容的提问来源于stack exchange,提问作者daddyimstuckplzhelp
相关产品推荐
相关产品推荐

