按帐户选择N个行百分比

时间:2016-04-05 21:09:29

标签: sql-server

我试图通过帐号选择一定百分比的人口,但我需要按部门平均分配该百分比。

例如:

我的帐户12345有100行。我需要按部门细分10%。

dept  count 
1     2 
2     2 
3     2
4     2 
5     2 

百分比可以在任何给定时间改变。有没有人对我有任何好的想法?我尝试使用tablesample函数,但看起来它只限于我想要完成的事情。

2 个答案:

答案 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