我有一个大约有 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 天才,他们一定会让我同时感到感激和自卑! :)
最佳答案
传递百分比是困难的部分。该工作由 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);
关于sql - 使用 tsql 根据不同百分比分配记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50547235/