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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:06:49