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

如何在窗口函数中对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:15:34