SQL Percercentile Calculation



我有以下查询,即使没有大量数据(〜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)组成,该表是零件号的名称,零件计数(Decimal 38,5),这是总销售额,item_rank(bigint)是基于总销售额的项目等级。

我试图根据其百分位数最终将我的零件分为类别 - 因此," A"项目将是前5%," B"项目将是下一个15%,而" C"项目将是成为第80个百分位数。我创建的视图正常工作,仅需将近三秒钟即可执行,这对于我的目的来说很慢。我将瓶脖子缩小到上述查询 - 任何帮助都将不胜感激。

您存在的问题是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还具有百分位功能和其他功能。

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

最新更新