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

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;

逻辑说明

  1. 内层查询通过PARTITION BY LENGTH(LABEL_ID)将数据按LABEL_ID的长度分成三个独立分组;
  2. ROW_NUMBER()为每个分组内的记录生成唯一行号,排序规则可根据业务需求调整;
  3. 外层查询筛选行号rn <=20的记录,确保每个分组最多返回20条数据;
  4. 若某长度的记录总数不足20条,会返回该长度的所有记录,不会填充空值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:05:37