我试图通过帐号选择一定百分比的人口,但我需要按部门平均分配该百分比。
例如:
我的帐户12345有100行。我需要按部门细分10%。
dept count
1 2
2 2
3 2
4 2
5 2
百分比可以在任何给定时间改变。有没有人对我有任何好的想法?我尝试使用tablesample函数,但看起来它只限于我想要完成的事情。
答案 0 :(得分:2)
假设您有足够的行,您可以使用窗口函数。要通过这个技巧均匀分配10%的样本:
select t.*
from (select t.*, row_number() over (partition by account order by seqnum_within_account) as seqnum
from (select t.*,
row_number() over (partition by account, dept order by (select null)) as seqnum_within_account,
count(*) over (partition by account) as cnt
from t
) t
) t
where seqnum * 10 <= cnt;
这是做什么的?最里面的select
为每个帐户中的每个部门分配一个序号。接下来是在每个帐户中分配序列号,因此它在各部门之间均匀分布。因此,如果有n个部门,前n个值来自不同的部门,下一个n等等(假设有足够的行)。
最终where
需要10%的样本。
注意:如果您只想为一个帐户提供信息,可以在最里面的子查询中添加where account = ???
。
答案 1 :(得分:0)
使用Row_Number()窗口函数
;with cte as (
select *
, ROW_NUMBER() over (partition by dept order by AccountNo) AS Rn
, count(AccountNo) over (partition by dept order by dept) AS Cnt
from #tt
)
select *
from cte
where Rn<=(1.0*Cnt)/10