SQL求助:MAX函数失效,如何筛选指定员工的最新更新记录
解决JD Edwards F08042表获取员工最新记录的SQL问题
原语句错误原因
你直接使用MAX(JWUPMJ)但未添加GROUP BY子句,违反了SQL聚合规则:当SELECT列表包含聚合函数(如MAX)时,所有非聚合列必须出现在GROUP BY中。数据库无法推断这些非聚合列应返回哪一行的值,因此语句执行失败。
解决方案
方法一:使用窗口函数(推荐,简洁高效)
窗口函数ROW_NUMBER()可按员工分组,再按更新日期降序给每条记录编号,编号为1的即为该员工的最新记录:
SELECT EMP_ID, DATA_ITEM, JULIAN_DATE, EFF_DATE, DATE_UPDATED, CHANGE_REASON FROM ( SELECT JWAN8 AS EMP_ID, JWDTAI AS DATA_ITEM, JWHSTD AS JULIAN_DATE, JWEFTO AS EFF_DATE, JWUPMJ AS DATE_UPDATED, JWTRS AS CHANGE_REASON, ROW_NUMBER() OVER (PARTITION BY JWAN8 ORDER BY JWUPMJ DESC) AS rn FROM PRODDTA.F08042 WHERE JWAN8 IN (146750, 1013535, 616248) AND JWDTAI = 'DT' ) t WHERE rn = 1;
PARTITION BY JWAN8:按员工ID分组ORDER BY JWUPMJ DESC:每组内按更新日期从新到旧排序rn = 1:筛选每组的第一条(最新)记录
方法二:分组关联法(兼容性好,适配所有SQL环境)
先通过分组查询得到每个员工的最新更新日期,再与原表关联获取完整记录:
SELECT f.JWAN8 AS EMP_ID, f.JWDTAI AS DATA_ITEM, f.JWHSTD AS JULIAN_DATE, f.JWEFTO AS EFF_DATE, f.JWUPMJ AS DATE_UPDATED, f.JWTRS AS CHANGE_REASON FROM PRODDTA.F08042 f INNER JOIN ( SELECT JWAN8, MAX(JWUPMJ) AS MAX_UPDATED FROM PRODDTA.F08042 WHERE JWAN8 IN (146750, 1013535, 616248) AND JWDTAI = 'DT' GROUP BY JWAN8 ) t ON f.JWAN8 = t.JWAN8 AND f.JWUPMJ = t.MAX_UPDATED WHERE f.JWDTAI = 'DT';
- 子查询先找出每个员工的最大更新日期
- 主查询通过员工ID和更新日期关联,获取对应完整记录
关于你尝试的REPLACE和CAST
如果JWUPMJ是存储为字符串的日期/数字,确实需要转换为数值类型才能正确取MAX,只需在ORDER BY或MAX()中替换为CAST(JWUPMJ AS INTEGER)即可,示例:
-- 窗口函数中转换的写法 ROW_NUMBER() OVER (PARTITION BY JWAN8 ORDER BY CAST(JWUPMJ AS INTEGER) DESC) AS rn
内容的提问来源于stack exchange,提问作者Royal Meteor
相关产品推荐
相关产品推荐

