我有以下查询,即使没有大量数据(〜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还具有百分位功能和其他功能。
在早期版本中,问题是如何有效地获得累积总和。您的查询可能与一个查询中可以完成的任何事情一样好。创建零件时,可以计算累积总和吗?您可以使用临时表吗?