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

Teradata SQL实现不拆分客户组的随机抽样需求

解决方案

核心思路是先抽样客户群体,再提取这些客户的所有订单记录,避免拆分单个客户的关联数据。以下是两种可行的实现方式:

方式一:基于客户记录数估算抽样(精准控制样本量)

如果需要更精准地接近200万条样本,可以先统计每个客户的订单数,再按随机顺序累加,直到总记录数接近200万,最后提取这些客户的全部记录:

-- 第一步:统计每个客户的订单数,随机排序后计算累计记录数
WITH customer_order_counts AS (
    SELECT 
        Cust_ID,
        COUNT(Order) AS order_count
    FROM your_table
    GROUP BY Cust_ID
),
ranked_customers AS (
    SELECT 
        Cust_ID,
        order_count,
        SUM(order_count) OVER (ORDER BY RAND()) AS cumulative_total
    FROM customer_order_counts
)
-- 第二步:选取累计记录数未超过200万的客户,再关联原表取出所有订单
SELECT t.*
FROM your_table t
JOIN (
    SELECT Cust_ID
    FROM ranked_customers
    WHERE cumulative_total <= 2000000
) sampled_customers ON t.Cust_ID = sampled_customers.Cust_ID;

注:RAND()函数在不同数据库写法有差异,比如Snowflake用RANDOM(),MySQL/BigQuery用RAND(),按需调整即可。

方式二:随机抽样客户(快速实现)

如果对样本量精准度要求不高,只需要约200万条,可以先按比例随机抽取客户,再拉取他们的所有记录:

-- 第一步:随机抽取客户(按平均订单数估算比例,比如1300万总记录/200万目标≈6.5,即抽取约15%的客户)
WITH sampled_customers AS (
    SELECT DISTINCT Cust_ID
    FROM your_table
    WHERE RAND() <= 0.15 -- 比例可根据实际样本偏差微调
)
-- 第二步:提取这些客户的所有订单记录
SELECT t.*
FROM your_table t
JOIN sampled_customers ON t.Cust_ID = sampled_customers.Cust_ID;

这种方法更简洁,适合快速落地,若最终样本量和目标偏差较大,微调比例值即可。

补充说明

  • 两种方法都严格保证了"选中客户的所有订单必被纳入样本"的要求
  • 若数据库支持TABLESAMPLE(如PostgreSQL),也可直接对去重后的客户集做抽样,再关联原表,本质和方式二一致

内容的提问来源于stack exchange,提问作者TheJammyHamster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 18:20:59