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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:01:18