如何在SQL中按区间拆分表并从各子表取1000行合并?
SQL实现按区间抽样后合并的方案
方法一:直接对应PySpark逻辑(适合少数量区间)
通过UNION ALL将每个区间的随机抽样结果合并,每个子查询单独过滤区间、随机排序后取前1000行:
SELECT * FROM your_table WHERE A > 1 AND A < 10 ORDER BY RAND() LIMIT 1000 UNION ALL SELECT * FROM your_table WHERE A > 10 AND A < 20 ORDER BY RAND() LIMIT 1000;
注意:不同数据库的随机排序函数有差异:
- MySQL/MariaDB 使用
RAND() - PostgreSQL 使用
RANDOM() - SQL Server 需用
ORDER BY NEWID()(RAND()在SQL Server中会为整个结果集生成单一随机值,无法实现行级随机排序) - Oracle 使用
ORDER BY DBMS_RANDOM.VALUE()
方法二:窗口函数分组抽样(适合多数量区间)
通过CASE WHEN标记行所属区间,再用ROW_NUMBER()窗口函数按区间分组随机排序,最后筛选每组前1000行,避免重复编写多个子查询:
SELECT t.* FROM ( SELECT *, -- 标记每行所属的区间组 CASE WHEN A > 1 AND A < 10 THEN 'range_1_to_10' WHEN A > 10 AND A < 20 THEN 'range_10_to_20' -- 可在此继续添加更多区间规则 END AS range_group, -- 按区间分组后随机排序,生成行号 ROW_NUMBER() OVER ( PARTITION BY CASE WHEN A > 1 AND A < 10 THEN 'range_1_to_10' WHEN A > 10 AND A < 20 THEN 'range_10_to_20' END ORDER BY RAND() ) AS row_num FROM your_table ) t WHERE row_num <= 1000;
同样需根据使用的数据库替换对应的随机排序函数。
内容的提问来源于stack exchange,提问作者waqar ali
相关产品推荐
相关产品推荐

