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

SQL技术求助:筛选E非空数据按A、B分组后取每组前10条全字段记录

解决方案

你需要用ROW_NUMBER()窗口函数来实现分组取前N条的需求,核心思路是先给每个(A,B)分组内的记录按指定规则编号,再筛选出编号≤10的记录。下面是适配你需求的完整SQL:

SELECT A, B, C, D, E
FROM (
    SELECT 
        A, B, C, D, E,
        -- 按A、B分组,组内按你需要的字段排序(这里示例用C,你可以替换成D或其他字段)
        ROW_NUMBER() OVER(PARTITION BY A, B ORDER BY C ASC) AS RN
    FROM TABLE
    -- 筛选E非空且不是空字符串
    WHERE E IS NOT NULL AND E <> ''
) AS subquery
-- 取每个分组的前10条
WHERE RN <= 10;

关键说明:

  • PARTITION BY A, B:把数据按A和B的组合分成不同的组
  • ORDER BY C ASC:组内记录的排序规则,必须指定(否则数据库无法确定"前10条"的顺序),你可以根据实际需求替换成D、或者其他字段,也可以改成DESC降序
  • 内层子查询给每条记录分配组内序号RN,外层只保留序号≤10的记录

关于你之前尝试的示例问题:

你参考的示例SQL有两个语法错误:

  1. 外层SELECT语句最后多了个逗号(arrivaldate, FROM这里)
  2. 部分数据库对WINDOW子句的支持可能有限,直接把窗口定义写在OVER()里兼容性更好

如果你的数据库支持WINDOW子句(比如PostgreSQL),修正后的写法也可以是:

SELECT A, B, C, D, E
FROM (
    SELECT 
        A, B, C, D, E,
        ROW_NUMBER() OVER w AS RN
    FROM TABLE
    WHERE E IS NOT NULL AND E <> ''
    WINDOW w AS (PARTITION BY A, B ORDER BY C ASC)
) AS subquery
WHERE RN <= 10;

内容的提问来源于stack exchange,提问作者Gr3go

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:15:29