如何编写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排序让结果更整洁。
验证示例数据
用你给出的示例数据测试,这个查询会输出:
| date | user_id | office_id |
|---|---|---|
| 2020-12-02 | 1 | D02 |
| 2020-12-02 | 2 | D01 |
| 2020-12-03 | 1 | D01 |
完全符合你的预期结果!
补充说明
如果你的数据库支持DATE_TRUNC('day', checkin_datetime)(比如PostgreSQL),也可以用它来替代CAST(checkin_datetime AS DATE),效果是一样的。另外,如果你需要处理大量数据,窗口函数的性能通常比关联子查询更好哦~
内容的提问来源于stack exchange,提问作者Najwan
相关产品推荐
相关产品推荐

