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 子句中,必须先在子查询中计算,外层再过滤。
评论
登录后才可以发表评论
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25050
- 42023-09-25浏览数:18521
- 52020-05-11浏览数:17526