【问题标题】:SQL Percercentile CalculationSQL 百分位数计算
【发布时间】:2012-10-28 00:01:08
【问题描述】:

我有以下查询,即使没有大量数据(约 3k 行),执行起来仍然有点慢,而且逻辑有点过头了——希望能得到一些帮助来优化查询,甚至另一种方法:

Select companypartnumber, (PartTotal + IsNull(Cum_Lower_Ranks, 0) ) / Sum(PartTotal) over() * 100 as Cum_PC_Of_Total
FROM PartSalesRankings PSRMain
Left join 
    (
        Select PSRTop.Item_Rank, Sum(PSRBelow.PartTotal) as Cum_Lower_Ranks
          from partSalesRankings PSRTop
          Left join PartSalesRankings PSRBelow on PSRBelow.Item_Rank < PSRTop.Item_Rank
         Group by PSRTop.Item_Rank 
    ) as PSRLowerCums on PSRLowerCums.Item_Rank = PSRMain.Item_Rank

PartSalesRankings 表仅由 CompanyPartNumber(bigint) 组成,它是零件编号名称,PartTotal(decimal 38,5) 是总销售额,以及 Item_Rank(bigint) 是基于总销售额的项目排名。

我正在尝试根据零件的百分位数将零件分类 - 因此“A”项目将是前 5%,“B”项目将是接下来的 15%,“C”项目将是较低的第 80 个百分位。我创建的视图运行良好,只需要将近三秒钟的时间来执行,这对我来说是相当慢的。我将瓶颈缩小到上述查询 - 任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server percentile


    【解决方案1】:

    您遇到的问题是PartTotal 的累积和的计算。如果您使用的是 SQL Server 2012,您可以执行以下操作:

    select (case when ratio <= 0.05 then 'A'
                 when ratio <= 0.20 then 'B'
                 else 'C'
            end),
           t.*
    from (select psr.companypartnumber,
                 (sum(PartTotal) over (order by PartTotal) * 1.0 / sum(PartTotal) over ()) as ratio
          FROM PartSalesRankings psr
         ) t
    

    SQL Server 2012 还具有百分位函数和其他早期版本中没有的函数。

    在早期版本中,问题是如何有效地获得累积和。您的查询可能与可以在一个查询中完成的任何事情一样好。创建partSalesRankings时可以计算累计和吗?可以使用临时表吗?

    【讨论】:

    • 不幸的是,我使用的是 SQL Sever 2005...我绝对可以使用临时表(或者如果更容易的话,可以将其转换为 SP)。我有点不确定如何在我的 PartSalesRankings 视图上计算累积总和......现在为了获得排名,我只是在对部分总和进行某种求和后使用一个行号......但同样,我愿意接受任何你有什么建议。
    猜你喜欢
    • 2011-12-29
    • 2013-06-20
    • 2016-07-28
    • 2017-08-29
    • 2021-09-22
    • 2021-02-26
    • 2021-10-30
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多