如何获取选定日期范围内各用户每日首次及末次刷卡记录
解决按用户每日获取首次/末次刷卡时间的问题
问题分析
你当前的查询存在两个核心问题,导致返回的是全量刷卡记录而非每日聚合结果:
- 窗口函数的
PARTITION BY e.LoggedTime是按每一条精确的刷卡时间单独分组,因此min和max结果和原时间完全一致,无法实现每日聚合 GROUP BY子句包含了完整的e.LoggedTime(带时分秒),导致每条刷卡记录都被单独分组,最终输出全量数据
修正后的SQL查询
要实现按用户+日期分组获取首次和末次刷卡时间,我们需要调整分组逻辑并简化聚合方式:
SELECT u.[FirstName] + ' ' + u.[LastName] AS EmployeeName, CAST(e.LoggedTime AS DATE) AS SwipeDate, MIN(e.LoggedTime) AS FirstSwipe, MAX(e.LoggedTime) AS LastSwipe FROM [ProtegeGX].[dbo].[Users] AS u LEFT JOIN [ProtegeGXEvents].[dbo].[Events] AS e ON e.RecordIndex1 = u.UserID LEFT JOIN [ProtegeGX].[dbo].[EventTypes] AS et ON e.EventTypeID = et.EventTypeID WHERE e.LoggedTime BETWEEN '2019-05-29' AND '2019-05-31' AND u.userid = 97 GROUP BY u.[FirstName] + ' ' + u.[LastName], CAST(e.LoggedTime AS DATE) ORDER BY EmployeeName, SwipeDate
关键逻辑说明
CAST(e.LoggedTime AS DATE):将带时分秒的时间转换为纯日期格式,确保同一用户的当日所有刷卡记录被归为同一分组MIN(e.LoggedTime)/MAX(e.LoggedTime):在每日分组内直接计算首次和末次刷卡的完整时间(保留时分秒)- 调整后的
GROUP BY仅保留用户名和日期,避免了按每条精确时间分组的问题
预期输出结果
| EmployeeName | SwipeDate | FirstSwipe | LastSwipe |
|---|---|---|---|
| Mike Donati | 2019-05-29 | 2019-05-29 09:21:01.673 | 2019-05-29 16:16:57.637 |
| Mike Donati | 2019-05-30 | 2019-05-30 07:49:33.710 | 2019-05-30 08:24:38.743 |
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

