如何从SQL表中获取各不同值数量均等的均匀样本?
如何按value分组获取均匀分布的样本?
针对你这种某类取值占比过高的表,要实现每个不同value各取2条数据的均匀样本,用窗口函数就能轻松解决,直接上SQL:
SELECT id, value FROM ( SELECT id, value, -- 按value分组,每组内给行编号 ROW_NUMBER() OVER (PARTITION BY value ORDER BY id) AS row_num FROM your_table -- 替换成你的实际表名 ) AS ranked_data WHERE row_num <= 2;
原理说明:
PARTITION BY value会把表按value拆分成独立分组,比如value=3、4、5各成一组;ROW_NUMBER()给每个分组里的行按指定规则(这里是ORDER BY id)编上连续序号;- 最后筛选
row_num <= 2,就能保证每个value分组只保留前2条记录,彻底避开单一取值主导样本的问题。
如果不想按id顺序取,想要随机抽取每组的2条,把排序规则换成随机函数即可:
- MySQL 用
ORDER BY RAND() - PostgreSQL 用
ORDER BY RANDOM()
示例SQL(以MySQL为例):
SELECT id, value FROM ( SELECT id, value, ROW_NUMBER() OVER (PARTITION BY value ORDER BY RAND()) AS row_num FROM your_table ) AS ranked_data WHERE row_num <= 2;
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

