如何用SQL按日期抽取每日10%的随机数据?
正确抽取每日10%随机样本的SQL方案
原SQL存在两个核心问题:
- 仅返回日期和样本数量,未输出预期的
id和date明细数据 rand() <= 0.10是全局随机过滤,无法保证每个日期的样本比例稳定在10%左右
以下是针对不同数据库的解决方案:
1. 精确按日期抽取10%样本(推荐)
通过窗口函数按日期分组,给每组内的记录随机排序后,筛选出前10%的行,能保证每个日期的样本比例严格接近10%。
MySQL/MariaDB
SELECT id, date FROM ( SELECT id, date, ROW_NUMBER() OVER (PARTITION BY date ORDER BY RAND()) AS row_num, COUNT(*) OVER (PARTITION BY date) AS daily_total FROM table_a ) temp WHERE row_num <= CEIL(daily_total * 0.10);
PostgreSQL
SELECT id, date FROM ( SELECT id, date, ROW_NUMBER() OVER (PARTITION BY date ORDER BY RANDOM()) AS row_num, COUNT(*) OVER (PARTITION BY date) AS daily_total FROM table_a ) temp WHERE row_num <= CEIL(daily_total * 0.10);
SQL Server
SELECT id, date FROM ( SELECT id, date, ROW_NUMBER() OVER (PARTITION BY date ORDER BY NEWID()) AS row_num, COUNT(*) OVER (PARTITION BY date) AS daily_total FROM table_a ) temp WHERE row_num <= CEIL(daily_total * 0.10);
2. 近似10%抽样(适合比例要求不严格的场景)
如果不需要严格保证每个日期的比例,仅需全局近似10%,可以直接过滤,但要查询明细而非计数:
SELECT id, date FROM table_a WHERE rand() <= 0.10;
注:这种方法的样本比例会有波动,部分日期可能偏离10%较多。
内容的提问来源于stack exchange,提问作者Sonia
相关产品推荐
相关产品推荐

