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有两个语法错误:
- 外层
SELECT语句最后多了个逗号(arrivaldate, FROM这里) - 部分数据库对
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
相关产品推荐
相关产品推荐

