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

SQL替代多次UNION ALL查询的优化方案咨询

优化多ROMECODE分组取数的查询方案

问题背景

需要针对指定的33个romecode值,每个值从数据表中获取最多30条记录,最终合并为一个数据集。当前实现方式是重复编写33段SELECT语句并通过UNION ALL拼接,代码冗余且维护成本高。

优化方案

利用窗口函数ROW_NUMBER()结合分区(PARTITION BY)逻辑,可一次性完成分组取数需求,代码更简洁高效:

SELECT 
  appellationlibelle,
  romelibelle,
  romecode,
  descriptioncleaned,
  description
FROM (
  SELECT 
    *,
    -- 按romecode分组,为每组内的行分配唯一序号
    ROW_NUMBER() OVER(PARTITION BY romecode ORDER BY (SELECT NULL)) AS row_num
  FROM `scrappers-293910.vigilant_memory_raw.indeed`
  -- 限定目标romecode列表
  WHERE romecode IN (
    'G1603', 'E1205', 'D1101', 'N1202', 'M1501', 'G1402', 'I1401',
    'M1607', 'J1102', 'C1201', 'M1801', 'I1203', 'I1604', 'M1705',
    'H2102', 'M1203', 'K2503', 'E1103', 'N1103', 'M1805', 'H1204',
    'M1602', 'D1106', 'M1707', 'C1501', 'M1701', 'G1101', 'J1302',
    'C1103', 'E1401', 'J1201', 'H1301', 'C1301'
  )
) t
-- 筛选每组前30条数据
WHERE row_num <= 30

方案说明

  • PARTITION BY romecode:将数据按romecode字段分组,确保序号仅在组内递增
  • ORDER BY (SELECT NULL):若无需特定排序逻辑,用此写法避免额外排序开销;如果需要按特定字段排序,替换为实际字段(如ORDER BY create_time DESC)
  • 外层查询通过row_num <=30过滤出每组的前30条记录,完全替代了重复的SELECT + LIMIT + UNION ALL结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:24:16