GBase 8a
其他
文章

窗口函数 ROW_NUMBER() 实现分组取最新记录

发表于2026-06-30 15:38:5313次浏览0个评论

功能讲解
ROW_NUMBER() 是 GBase 8a 支持的窗口函数之一,为结果集的每一行分配一个连续唯一序号。配合 PARTITION BY 分组和子查询过滤,可以轻松实现"取每个分组中最新/最大的一条记录"——这在传统写法中需要复杂的自连接才能实现。

使用示例

-- 场景:查询每个用户最近一次登录的记录

-- 准备数据
CREATE TABLE user_login (
   user_id    INT,
   login_time DATETIME,
   ip_addr    VARCHAR(50)
);

-- 核心写法:用 ROW_NUMBER() 按用户分组、按时间倒序编号
SELECT user_id, login_time, ip_addr
FROM (
   SELECT user_id,
          login_time,
          ip_addr,
          ROW_NUMBER() OVER (
              PARTITION BY user_id 
              ORDER BY login_time DESC
          ) AS rn
   FROM user_login
) t
WHERE rn = 1;

三种排名函数对比
函数   遇到并列值时   示例结果
ROW_NUMBER()   强制连续编号,不重复   1, 2, 3, 4

RANK()   并列同名次,后续跳号   1, 1, 3, 4

DENSE_RANK()   并列同名次,后续不跳号   1, 1, 2, 3

 注意:窗口函数不能直接放在 WHERE 子句中,必须先在子查询中计算,外层再过滤。
 

评论

登录后才可以发表评论