使用tsql根据不同的百分比分发记录
我有一个大约800k行的项目表。我需要创建一个SQL语句,允许我的用户传递各种百分比,总计为100%,限制为5个百分比。然后使用这些值按每个百分比的组号对行进行分组 例如,用户可以使用以下随机百分比请求拆分行:使用tsql根据不同的百分比分发记录,sql,azure,azure-sql-database,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 -------------
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%,第二组是下一个20%,第三组是下一个30%,第四组是最后的30%。因此,如果总共有200条记录,第1组应该有40条记录,第2组有40条记录,第3组有60条记录,第4组有60条记录
对不起,如果我过度解释了这一点,但试图减少我的问题中的任何歧义,使其清晰
此数据存储在Azure SQL中,因此提供的任何解决方案在大多数情况下都可以使用Azure SQL和/或SQL 2016提供的任何内容
提前感谢SQL天才们,他们一定会让我同时感到感激和自卑 通过百分比是困难的部分。工作按百分比等级完成:
绝妙的解决方案!我有一个传递百分比并将其应用于此查询的解决方案。谢谢
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);