SQL中如何基于TIMESTAMP字段选取每个user_id的最早登录记录
各user_id对应最早登录时间查询方案
方法1:GROUP BY + MIN 聚合(最通用写法)
这是实现需求最简单的写法,兼容所有主流关系型数据库:
SELECT user_id, DATE(MIN(log_in_time)) AS earliest_login_date FROM 替换为你的实际表名 GROUP BY user_id;
- 用
GROUP BY user_id保证输出的user_id全局唯一 MIN(log_in_time)会自动取每个用户分组下最早的登录时间DATE()函数用于把带时分秒时区的时间戳转换为仅日期格式,匹配你需要的输出样式。如果需要保留完整的登录时间戳,直接去掉DATE()包裹即可。
方法2:窗口函数写法(适合扩展场景)
如果后续需要同时获取最早登录时间对应的其他字段(比如登录IP、登录设备等),可以用窗口函数实现:
SELECT user_id, DATE(log_in_time) AS earliest_login_date FROM ( SELECT user_id, log_in_time, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY log_in_time ASC) AS rank_num FROM 替换为你的实际表名 ) temp_table WHERE rank_num = 1;
- 内层查询按
user_id分组,对每个用户的登录记录按登录时间升序排名,最早的记录排名为1 - 外层过滤仅保留排名为1的记录,即可得到每个用户的最早登录数据
输出结果示例
两种写法返回的结果都和你要求的一致:
| user_id | earliest_login_date |
|---|---|
| 344 | 2021-10-05 |
| 345 | 2021-10-03 |
内容的提问来源于stack exchange,提问作者Melter
相关产品推荐
相关产品推荐

