0

私は次のクエリを持っていますが、大量のデータ(〜3000行)がなくても実行が少し遅く、ロジックが少し頭を悩ませています-クエリの最適化や別の方法論の助けを得ることを望んでいました:

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パーセンタイル。私が作成したビューは正常に機能します。実行には約3秒かかりますが、これは私の目的では非常に遅いです。ボトルネックを上記のクエリに絞り込みました。ご協力いただければ幸いです。

4

1 に答える 1

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 には、以前のバージョンにはないパーセンタイル関数やその他の関数もあります。

以前のバージョンでは、累積和を効率的に取得する方法が問題でした。あなたのクエリは、おそらく 1 つのクエリで実行できるものと同じくらい優れています。partSalesRankingsの作成時に累計を計算することはできますか? 一時テーブルを使用できますか?

于 2012-11-07T21:11:55.250 に答える