sql - 使用 tsql 根据不同百分比分配记录

标签 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 天才,他们一定会让我同时感到感激和自卑! :)

最佳答案

传递百分比是困难的部分。该工作由 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/

相关文章:

sql - 主键还是唯一索引?

database - Azure SQL 数据库 : Failover secondary DB is read-only

azure - 通过托管身份和私有(private)端点从 Azure WebApp 访问 Azure SQL

c# - 如何保证 CosmosDB 数据与 ServiceBus 保持同步,不被死信消息覆盖

php - 找到表名,然后从该表中获取数据。

mysql - 不使用子查询过滤值

sql - 使用数据库的主键作为业务对象标识符是一个坏主意吗?

angular - 使用 Angular SPA MSAL 库在 Azure B2C 上执行用户流

java - 使用 Azure Java SDK V12 和 ListBlobs() 列出 Azure Blobstorage 中的 Blob 速度非常慢

azure - 获取 无法解析请求。 (错误代码 : InvalidRequestFormat) on Module Update-AzureRmVmss on PowerShell