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

如何编写SQL查询获取每日单用户最新签到记录

解决每日签到用户最新记录查询问题

嘿,我刚好处理过类似的需求,用窗口函数就能轻松搞定这个问题!下面是具体的解决方案:

核心思路

我们需要给每个用户每天的签到记录按时间排序,只保留排序为1的那条(也就是最新的)。这里用ROW_NUMBER()窗口函数是最直观高效的方式。

完整SQL查询

SELECT 
    CAST(checkin_datetime AS DATE) AS date,
    user_id,
    office_id
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY CAST(checkin_datetime AS DATE), user_id 
            ORDER BY checkin_datetime DESC
        ) AS rn
    FROM CHECKIN_TABLE
) t
WHERE rn = 1
ORDER BY date, user_id;

代码解释

  • 内层子查询:用PARTITION BY CAST(checkin_datetime AS DATE), user_id把数据按「日期+用户」分组,然后用ORDER BY checkin_datetime DESC给每组内的记录按签到时间倒序排列,ROW_NUMBER()会给每组的记录编号,最新的那条就是rn=1。
  • 外层查询:筛选出rn=1的记录,同时把checkin_datetime转成日期格式得到date字段,最后按日期和用户ID排序让结果更整洁。

验证示例数据

用你给出的示例数据测试,这个查询会输出:

dateuser_idoffice_id
2020-12-021D02
2020-12-022D01
2020-12-031D01

完全符合你的预期结果!

补充说明

如果你的数据库支持DATE_TRUNC('day', checkin_datetime)(比如PostgreSQL),也可以用它来替代CAST(checkin_datetime AS DATE),效果是一样的。另外,如果你需要处理大量数据,窗口函数的性能通常比关联子查询更好哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:54:32