如何查询每个员工对应最大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
相关产品推荐
相关产品推荐

