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

如何查询每个员工对应最大START_DATE的记录?SQL语句调试求助

获取员工最新记录的正确SQL写法

你这两个写法都有语法或逻辑问题,逐个说明问题并给出修正方案:

第一个写法的问题与修正

  • 窗口函数语法错误:(MAX)START_DATE 应为 MAX(START_DATE)
  • 子查询未设置别名,外层无法正确引用列;且外层WHERE中直接用Tb2.START_DATE无效,需改用子查询返回的列名
  • 修正后的代码:
SELECT PERSON_NO, START_DATE
FROM (
    SELECT 
        Tb1.PERSON_NO, 
        Tb2.START_DATE, 
        MAX(Tb2.START_DATE) OVER (PARTITION BY Tb1.PERSON_NO) AS LATEST_START
    FROM Tb1
    INNER JOIN Tb2 ON Tb1.PERSON_NO = Tb2.PERSON_NO
) AS temp
WHERE START_DATE = LATEST_START;

第二个写法的问题

WHERE子句内的子查询使用窗口函数逻辑错误——窗口函数返回的是一组值,而非单个标量值,无法直接与Tb2.START_DATE做等值比较。

其他可行写法

分组关联法(逻辑直观)

SELECT Tb1.PERSON_NO, Tb2.START_DATE
FROM Tb1
INNER JOIN Tb2 ON Tb1.PERSON_NO = Tb2.PERSON_NO
INNER JOIN (
    SELECT PERSON_NO, MAX(START_DATE) AS LATEST_START
    FROM Tb2
    GROUP BY PERSON_NO
) AS latest ON Tb2.PERSON_NO = latest.PERSON_NO AND Tb2.START_DATE = latest.LATEST_START;

ROW_NUMBER窗口函数法(适合需返回更多列的场景)

SELECT PERSON_NO, START_DATE
FROM (
    SELECT 
        Tb1.PERSON_NO, 
        Tb2.START_DATE,
        ROW_NUMBER() OVER (PARTITION BY Tb1.PERSON_NO ORDER BY Tb2.START_DATE DESC) AS rn
    FROM Tb1
    INNER JOIN Tb2 ON Tb1.PERSON_NO = Tb2.PERSON_NO
) AS temp
WHERE rn = 1;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:49:57