首页/数据/SQL 速查/每组取最新一行:窗口函数写法

每组取最新一行:窗口函数写法

“每个用户最近一笔订单”这类需求的通用解法:ROW_NUMBER 按组内排序编号,取 rn=1 后左连接到主表。

SQL 速查数据更新于 2026-10-12

示例

示例
WITH ranked AS (
    SELECT o.*,
           ROW_NUMBER() OVER (PARTITION BY o.user_id
                              ORDER BY o.created_at DESC, o.id DESC) AS rn
    FROM orders o
)
SELECT u.id, u.name, r.amount AS last_amount
FROM users u
LEFT JOIN ranked r
       ON r.user_id = u.id AND r.rn = 1
ORDER BY u.id;
思路组内排序编号,再筛编号 1
连接LEFT JOIN 保留没有订单的用户
索引PARTITION BY + ORDER BY 列上的复合索引可减少排序代价

易错点

  • 连接条件漏写 r.rn = 1 会连出每个用户的全部订单行
  • 排序键时间相同时“最新”不确定,补主键列做次级排序键

数据来源与参考

  • MySQL 8.0 Reference Manual · Window Functions
  • PostgreSQL Documentation · Window Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌