Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用tsql根据不同的百分比分发记录_Sql_Azure_Azure Sql Database - Fatal编程技术网

使用tsql根据不同的百分比分发记录

使用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 -------------

我有一个大约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%,第二组是下一个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);