【问题标题】:Distribute records based on various percentages with tsql使用 tsql 根据各种百分比分布记录
【发布时间】:2018-05-26 21:43:41
【问题描述】:

我有一个包含大约 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%,第 3 组是接下来的 30%,第 4 组是最后的 30%。因此,如果总共有 200 条记录,那么第 1 组应该有 40 条记录,第 2 组有 40 条,第 3 组有 60 条,第 4 组有 60 条。

对不起,如果我解释过度了,但试图减少我的问题中的任何歧义,所以很清楚。

此数据存储在 Azure SQL 中,因此提供的任何解决方案都可以使用 Azure SQL 和/或 SQL 2016(在大多数情况下)提供的任何内容。

在此先感谢 SQL 天才,他们肯定会让我同时感到感激和自卑! :)

【问题讨论】:

    标签: sql azure azure-sql-database


    【解决方案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);
    

    【讨论】:

    • 绝妙的解决方案!我有一个解决方案来传递百分比并将它们应用于此查询。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    相关资源
    最近更新 更多