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
相关产品推荐
相关产品推荐

