SQL LEFT JOIN关联表时取同ID对应MAX(EndDt)记录实现方案问询
这个需求完全可以实现。你原有写法的错误点是不能直接在JOIN条件中使用MAX()聚合函数做筛选,聚合函数的结果需要先通过分组或者窗口函数计算完成后才能用于关联匹配。
以下是两种通用的正确SQL写法:
写法1:窗口函数实现(支持MySQL 8.0+、PostgreSQL、SQL Server、Oracle等所有支持窗口函数的数据库)
逻辑是先对table2按id分组,给同id下的所有记录按EndDt倒序排序,取排序第一的记录再和table1关联:
SELECT a.*, b.SomeVal FROM table1 a LEFT JOIN ( SELECT id, SomeVal, ROW_NUMBER() OVER (PARTITION BY id ORDER BY EndDt DESC) AS rn FROM table2 ) b ON a.Id = b.id AND b.rn = 1
说明:如果同id存在多条EndDt完全相同的最大值记录,只需要返回其中一条的话用ROW_NUMBER()即可;如果需要返回所有最大EndDt的记录,把ROW_NUMBER()换成RANK()即可。
写法2:子查询匹配最大日期(兼容所有SQL版本,包括低版本MySQL)
逻辑是先查询出table2每个id对应的最大EndDt,再关联回table2拿到对应的SomeVal值,最后和table1关联:
SELECT a.*, b2.SomeVal FROM table1 a LEFT JOIN ( SELECT id, MAX(EndDt) AS max_enddt FROM table2 GROUP BY id ) b1 ON a.Id = b1.id LEFT JOIN table2 b2 ON b1.id = b2.id AND b1.max_enddt = b2.EndDt
内容的提问来源于stack exchange,提问作者user17336551
相关产品推荐
相关产品推荐

