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

如何高效查询每个用户最新日期及对应最新序列的SQL记录

高效SQL查询:获取用户最新日期下最大sequence的记录

表结构与示例数据

假设表名为user_records,结构和数据如下:

username, date, sequence, value
--------------------------
Hannah, 1/2/2010, 0, peach
Kim, 1/3/2010, 0, watermelon
Hannah, 8/4/2009, 0, mango
David, 2/2/2010, 0, apple
David, 2/2/2010, 1, orange
David, 1/3/2010, 0, banana

需求说明

需要查询每个用户的最新日期记录;若该日期下存在多条记录,则选取其中sequence值最大的条目。由于表数据量极大,查询必须保证高效,避免CPU过载。

高效查询方案

方案一:窗口函数(推荐,多数现代数据库支持)

使用ROW_NUMBER()窗口函数,按用户分组后先按日期降序、再按sequence降序排序,直接取每组的第一条记录。这种方法只需扫描一次表,执行效率高。

SELECT username, date, sequence, value
FROM (
    SELECT 
        username, 
        date, 
        sequence, 
        value,
        ROW_NUMBER() OVER (
            PARTITION BY username 
            ORDER BY date DESC, sequence DESC
        ) AS rn
    FROM user_records
) AS ranked
WHERE rn = 1;

方案二:关联子查询(兼容旧版数据库)

通过子查询先定位每个用户的最大日期,以及该日期下的最大sequence,再关联原表获取对应完整记录。

SELECT ur.username, ur.date, ur.sequence, ur.value
FROM user_records ur
INNER JOIN (
    SELECT 
        username, 
        MAX(date) AS max_date,
        MAX(sequence) AS max_seq
    FROM user_records
    GROUP BY username, date
    HAVING date = MAX(date)
) AS sub
ON ur.username = sub.username 
   AND ur.date = sub.max_date 
   AND ur.sequence = sub.max_seq;

性能优化关键

针对大数据量场景,必须创建复合索引来避免全表扫描:

CREATE INDEX idx_user_date_seq ON user_records (username, date DESC, sequence DESC);

该索引能让数据库快速定位每个用户的最新日期及对应最大sequence的记录,大幅降低CPU负载。

预期查询结果

Hannah, 1/2/2010, 0, peach
Kim, 1/3/2010, 0, watermelon
David, 2/2/2010, 1, orange

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:15:34