SQL Server如何查询Attendance表各分行每日最早签到记录及对应员工ID
SQL Server 考勤表分行每日最早签到记录查询方案
实现方案(推荐窗口函数写法,SQL Server 2008+支持)
核心逻辑:按分行ID、签到自然日对记录分组,组内按签到时间升序排序,取每组第一条记录即可。
WITH RankedAttendance AS ( SELECT BranchID, SignDate, EmployeeID, ROW_NUMBER() OVER ( PARTITION BY BranchID, CAST(SignDate AS DATE) ORDER BY SignDate ASC ) AS rn FROM Attendance ) SELECT BranchID, SignDate 最早签到时间, EmployeeID 最早签到员工ID FROM RankedAttendance WHERE rn = 1;
注意事项
- 若需查询同一分行同日所有并列最早签到的员工,将代码中的
ROW_NUMBER()替换为RANK()即可 CAST(SignDate AS DATE)用于提取DateTime类型的日期部分,实现按自然日分组- 若需兼容更旧版本的SQL Server,可使用关联子查询写法:
SELECT a.BranchID, a.SignDate 最早签到时间, a.EmployeeID 最早签到员工ID FROM Attendance a INNER JOIN ( SELECT BranchID, MIN(SignDate) MinSignDate FROM Attendance GROUP BY BranchID, CAST(SignDate AS DATE) ) b ON a.BranchID = b.BranchID AND a.SignDate = b.MinSignDate;
内容的提问来源于stack exchange,提问作者RoyM
相关产品推荐
相关产品推荐

