Oracle SQL:如何获取不同用户的上一条消息?
获取Oracle中每个用户的最新消息(上一条消息)
要实现这个需求,核心是按用户分组,找出每组内发送时间最晚的那条记录,在Oracle里有几种实用的写法,我给你详细拆解下:
方法1:使用ROW_NUMBER()窗口函数(推荐)
这是最直观也最灵活的方式,通过窗口函数给每个用户的消息按发送时间倒序编号,取编号为1的那条就是该用户的最新消息。
SELECT id, username, send_date, message FROM ( SELECT id, username, send_date, message, ROW_NUMBER() OVER (PARTITION BY username ORDER BY send_date DESC) AS rn FROM your_table_name -- 替换成你的实际表名 ) t WHERE rn = 1;
逻辑说明:
PARTITION BY username:按用户名分组,把同一个用户的消息归为一组ORDER BY send_date DESC:在每组内按发送时间从晚到早排序ROW_NUMBER():给每组内的记录按排序结果编号,最新的消息会被标为1- 外层查询筛选
rn=1的记录,就得到每个用户的最新消息
针对你提供的示例数据,执行后会返回:
id, username, send_date, message 4, user A, 13.02.2018 09:29:23, 'see here' 5, user B, 13.02.2018 13:34:12, 'do this'
方法2:使用MAX()聚合+关联查询
如果你的Oracle版本偏旧(不过现在大多都支持窗口函数了),也可以用这种传统写法:
SELECT t.id, t.username, t.send_date, t.message FROM your_table_name t JOIN ( SELECT username, MAX(send_date) AS latest_date FROM your_table_name GROUP BY username ) t_max ON t.username = t_max.username AND t.send_date = t_max.latest_date;
逻辑说明:
- 子查询先找出每个用户的最晚发送时间
- 再通过关联查询,匹配出对应时间的完整消息记录
⚠️ 注意:如果同一个用户在同一时间发送了多条消息,这种方法会返回所有同时间的记录;而ROW_NUMBER()只会返回其中一条(如果需要保留同时间的多条,可以改用RANK()或DENSE_RANK())。
内容的提问来源于stack exchange,提问作者Azat Usmanov
相关产品推荐
相关产品推荐

