use*_*444 6 sql sql-server random
我有一张5800万客户记录表.每个客户都有市场价值(EN,US,FR等)
我正在尝试选择一个包含来自各个市场的客户的100k样本集.样本中每个市场的客户比例必须与实际表中的比率相匹配.
因此,如果英国客户占客户表中记录的15%,那么在100k样本集中必须有15k英国客户,并且每个市场都必须相同.
有没有办法做到这一点?
首先,一个简单的随机样本应该很好地代表市场规模.您要求的是分层样本.
获得这样一个样本的一种方法是随机排序数据并在每个组中分配一个序号.然后将序列号标准化为0到1之间,最后按标准化值排序并选择前"n"行:
select top 100000 c.*
from (select c.*,
row_number() over (partition by market order by rand(checksum(newid()))
) as seqnum,
count(*) over (partition by market) as cnt
from customers c
) c
order by cast(seqnum as float) / cnt
Run Code Online (Sandbox Code Playgroud)
如果你查看数据,可能很清楚发生了什么.考虑从以下5个样本中取样:
1 A
2 B
3 C
4 D
5 D
6 D
7 B
8 A
9 D
10 C
Run Code Online (Sandbox Code Playgroud)
第一步是在每个市场中随机分配一个序号:
1 A 1
2 B 1
3 C 1
4 D 1
5 D 2
6 D 3
7 B 2
8 A 2
9 D 4
10 C 2
Run Code Online (Sandbox Code Playgroud)
接下来,规范化这些值:
1 A 1 0.50
2 B 1 0.50
3 C 1 0.50
4 D 1 0.25
5 D 2 0.50
6 D 3 0.75
7 B 2 1.00
8 A 2 1.00
9 D 4 1.00
10 C 2 1.00
Run Code Online (Sandbox Code Playgroud)
现在,如果你进入前5名,你将获得前五个值,这是一个分层样本.