使用tsql根据各种百分比分配记录

时间:2018-05-26 21:43:41

标签: sql azure azure-sql-database

我有一个大约800k行的项目表。我需要创建一个SQL语句,允许我的用户以不同的百分比传递,总分为100%,并限制为5%。然后使用这些行按每个百分比的组编号对行进行分组。

例如,用户可以使用以下随机百分比请求行拆分(用户决定百分比):

 1. 20%, 20%, 30%, 30% 
 2. 12%, 12%, 12%, 12%, 52%
 3. 30%, 30%, 40%
 4. 100%

根据以上百分比,我需要返回以下内容:

Field 1    | Field 2    | Group
--------------------------------
Data       | Data       | 1
Data       | Data       | 1

该组将代表与百分比相对应的数字。因此,例如上面的百分比#1,将有4个组,第一组的记录是所有项目的第一个20%,第2组是下一个20%,第三组是下一个30%,第四组是最后30%。因此,如果总共有200条记录,第1组应该有40条记录,第2组有40条,第3组有60条,第4组有60条。

很抱歉,如果我在解释这个问题,但试图减少我问题中的任何含糊之处,那么很清楚。

此数据存储在Azure SQL中,因此提供的任何解决方案都可以使用Azure SQL和/或SQL 2016(在大多数情况下)提供的任何内容。

感谢那里的SQL天才,肯定会让我同时感到欣赏和低劣! :)

1 个答案:

答案 0 :(得分:1)

传递百分比是困难的部分。这项工作由percent_rank()完成:

with p as (
      select ind, p, (sum(p) over (order by ind) - p) as cume_p
      from (values (1, 0.2), (2, 0.2), (3, 0.3), (4, 0.4)) v(ind, p)
     )
select t.*, v.grp
from (select t.*, percent_rank() over (order by ?) as pr
      from t
     ) t cross apply
     (select max(ind)
      from p
      where p.cume_p <= t.pr
     )  v(grp);