如何在SQL Server中实现符合Last IN First OUT规则的考勤数据转换?
SQL Server 实现 Last IN First OUT 数据聚合方案
需求说明
从原始打卡记录表(表1)中,按日期分组,提取每日最后一次进入(IN)时间和第一次离开(OUT)时间,生成表2格式的结果,遵循Last IN First OUT规则。
原始数据(表1)
| 日期 | 时间 | IN/OUT |
|---|---|---|
| 8/1/2022 | 0800H | IN |
| 8/1/2022 | 0802H | IN |
| 8/1/2022 | 1700H | OUT |
| 8/2/2022 | 0810H | IN |
| 8/2/2022 | 1700H | OUT |
| 8/3/2022 | 0800H | IN |
| 8/3/2022 | 1700H | OUT |
| 8/3/2022 | 1710H | OUT |
目标结果(表2)
| 日期 | IN | OUT |
|---|---|---|
| 8/1/2022 | 0802H | 1700H |
| 8/2/2022 | 0810H | 1700H |
| 8/3/2022 | 0800H | 1700H |
最优实现代码
使用聚合函数直接分组计算,仅需一次表扫描,效率最高:
SELECT 日期, MAX(CASE WHEN [IN/OUT] = 'IN' THEN 时间 END) AS [IN], MIN(CASE WHEN [IN/OUT] = 'OUT' THEN 时间 END) AS [OUT] FROM 表1 GROUP BY 日期 ORDER BY 日期;
代码说明
- 分组逻辑:按
日期字段分组,确保每日数据单独计算。 - Last IN 提取:通过
MAX(CASE...)筛选出所有IN记录,取最大的时间值(即当日最晚进入时间)。 - First OUT 提取:通过
MIN(CASE...)筛选出所有OUT记录,取最小的时间值(即当日最早离开时间)。 - 兼容性:即使
时间字段是字符串类型(如示例中的0802H格式),只要格式统一,字符串的MAX/MIN比较逻辑完全符合时间先后顺序。
内容的提问来源于stack exchange,提问作者BagZ
相关产品推荐
相关产品推荐

