需要基于总收入之和提取数据

时间:2019-03-31 08:51:36

标签: sql sql-server

我有一个数据集,我们有100,000个客户。 客户总收入为200万。

现在,我需要100,000个客户中的4个批次,即每个25,000个,总收入为50万。

请您帮我这个SQL脚本

2 个答案:

答案 0 :(得分:0)

为了提取批次,您可以将CTE与ROW_NUMBER()结合使用:

with cte as 
( select field1, field2, row_number() over(order by customerid) as rownum
from table)
select * from cte where rownum < 25000

请注意,这不能保证收入金额为0.5

您可以通过添加

查看收入
 with cte as 
    ( select field1, field2, row_number() over(order by customerid) as rownum
    from table)
select sum(revenue) from cte
where rownum < 25000

答案 1 :(得分:0)

您最好的选择可能是将客户分为四个随机组。有了您正在谈论的数字,这些值将非常接近:

select t.*,
       ntile(4) over (order by newid()) as grp
from t;

一个更规范的答案是对样本进行分层。通常,这会做得很好:

select t.*,
       (row_number() over (order by revenue) % 4) as grp
from t;

这不是完美的。但是,您的问题没有完美的答案。毕竟,一个客户可能获得一半的收入,因此不可能用相同大小和相同收入的垃圾箱来回答您的问题。

分层方法实际上可以改进为连续值。想法是根据收入将客户分成n / 4个分类,然后在每个组中随机选择:

select t.*,
       (row_number() over (partition by bin order by newid()) % 4 as grp
from (select t.*,
             (row_number() over (order by revenue) / 4) as bins
      from t
     ) t;