我有一个大约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天才,肯定会让我同时感到欣赏和低劣! :)
答案 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);