You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取选定日期范围内各用户每日首次及末次刷卡记录

解决按用户每日获取首次/末次刷卡时间的问题

问题分析

你当前的查询存在两个核心问题,导致返回的是全量刷卡记录而非每日聚合结果:

  • 窗口函数的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仅保留用户名和日期,避免了按每条精确时间分组的问题

预期输出结果

EmployeeNameSwipeDateFirstSwipeLastSwipe
Mike Donati2019-05-292019-05-29 09:21:01.6732019-05-29 16:16:57.637
Mike Donati2019-05-302019-05-30 07:49:33.7102019-05-30 08:24:38.743

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:44:54