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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:25:30