如何在窗口函数中对ACCT_ID分组后限制每组最多返回10条数据?
正确实现分组内取前10条记录的SQL方案
原代码的核心问题是误用了first_value()函数——它只会返回分组内的第一个acct_id值,根本无法生成分组内的行号,自然没法实现"每个分组最多保留10条"的需求。
正确实现思路
要实现需求,需要使用ROW_NUMBER()窗口函数,它能为每个分组内的记录生成连续的行号,具体步骤如下:
- 先筛选出
PLAN_STATUS_CD = 'ACTIVE'的记录,减少后续计算的数据量 - 按
acct_id分组,为每组内的记录生成行号 - 筛选出行号≤10的记录,实现每组最多保留10条
完整SQL代码
WITH ranked_plans AS ( SELECT o.*, ROW_NUMBER() OVER ( PARTITION BY acct_id ORDER BY acct_id ASC -- 建议替换为业务需要的排序字段(如创建时间),保证结果稳定 ) AS row_num FROM ACCT_PLAN o WHERE PLAN_STATUS_CD = 'ACTIVE' ) SELECT * FROM ranked_plans WHERE row_num <= 10 ORDER BY acct_id, row_num;
关键说明
ROW_NUMBER():为每个acct_id分组内的记录从1开始生成唯一行号,同一分组内不会有重复行号- 窗口内的
ORDER BY:必须指定排序规则,否则数据库会随机返回前10条,建议根据业务逻辑选择排序字段(比如create_time DESC取最新的10条) - 提前筛选ACTIVE记录:相比先做窗口函数再筛选,这样能减少窗口函数的计算量,提升查询效率
内容的提问来源于stack exchange,提问作者Jony_Junior
相关产品推荐
相关产品推荐

