Oracle SQL如何按LABEL_ID长度分组各获取20条记录?
按LABEL_ID长度分组各取20条记录的解决方案
原SQL语句的问题在于ROWNUM <=20是对全局结果集取前20条,而长度为10的记录数量最多,所以全部返回了这类记录,无法获取其他长度的目标数据。要实现每个指定长度(10、13、24)各取最多20条记录,可以借助Oracle的分析函数来分组生成行号,再筛选行号范围。
基础实现(按LABEL_ID排序取前20条)
SELECT LABEL_ID, DEST, WEIGHT_OZ FROM ( SELECT LABEL_ID, DEST, WEIGHT_OZ, -- 按LABEL_ID长度分组,组内按LABEL_ID排序生成行号 ROW_NUMBER() OVER (PARTITION BY LENGTH(LABEL_ID) ORDER BY LABEL_ID) AS rn FROM MYTABLE WHERE LENGTH(LABEL_ID) IN (10,13,24) ) WHERE rn <= 20;
随机抽取每组20条记录
如果需要随机获取每组的20条数据,可以将排序条件替换为随机值:
SELECT LABEL_ID, DEST, WEIGHT_OZ FROM ( SELECT LABEL_ID, DEST, WEIGHT_OZ, -- 按LABEL_ID长度分组,组内随机排序生成行号 ROW_NUMBER() OVER (PARTITION BY LENGTH(LABEL_ID) ORDER BY DBMS_RANDOM.VALUE) AS rn FROM MYTABLE WHERE LENGTH(LABEL_ID) IN (10,13,24) ) WHERE rn <= 20;
逻辑说明
- 内层查询通过
PARTITION BY LENGTH(LABEL_ID)将数据按LABEL_ID的长度分成三个独立分组; ROW_NUMBER()为每个分组内的记录生成唯一行号,排序规则可根据业务需求调整;- 外层查询筛选行号
rn <=20的记录,确保每个分组最多返回20条数据; - 若某长度的记录总数不足20条,会返回该长度的所有记录,不会填充空值。
内容的提问来源于stack exchange,提问作者NoBullMan
相关产品推荐
相关产品推荐

