如何查询员工不晚于当前日期的最新数据库记录?
解决方法
方案1:调整子查询逻辑
原代码的问题在于HAVING MAX(Start_Date) <= GETDATE()是先取每个员工所有记录里的最大日期,再判断该日期是否<=当前日期。如果员工的最大日期是未来的,整个组会被直接过滤,自然查不到结果。
正确逻辑是先筛选出所有不晚于当前日期的记录,再按员工分组取最大的Start_Date,代码如下:
SELECT WA.* FROM WA INNER JOIN ( SELECT [Employee], MAX(Start_Date) as StartDate FROM WA WHERE Start_Date <= GETDATE() -- 先过滤符合日期条件的记录 GROUP BY [Employee] ) as WA2 ON WA.Employee = WA2.Employee AND WA.Start_Date = WA2.StartDate
方案2:使用窗口函数(更简洁)
用ROW_NUMBER()窗口函数按员工分组,对不晚于当前日期的记录按Start_Date降序排序,取每组的第一条,就是该员工符合条件的最新记录:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY [Employee] ORDER BY Start_Date DESC) as rn FROM WA WHERE Start_Date <= GETDATE() ) t WHERE rn = 1
说明
- 两种方案都会返回每位员工所有不晚于当前日期的记录中最新的那一条;
- 如果某员工没有任何不晚于当前日期的记录(所有记录都是未来的),则不会返回该员工的结果,符合业务逻辑要求。
内容的提问来源于stack exchange,提问作者jss123
相关产品推荐
相关产品推荐

