0

パーセンタイルに使用している行の 1 つが次のような SELECT があります。

NTILE(100) OVER(PARTITION BY ItemID ORDER BY SUM(quantity)) as Percentile

データは次のようになります。

ItemID  |  Quantity  |  Price  |  TotalQ
ABC        10           14.50     38
ABC        4            14.25     38
DEF        32           22.41     34
ABC        24           14.10     38
GHI        8            8.50      20
GHI        12           8.60      20
DEF        2            22.30     34

ただし、Percentile フィールドは、各 ItemID のすべての数量のランキングにすぎません。各行で、各トランザクション価格 (各行は個々のトランザクション) のボリュームの累積パーセントを上から下に向かって測定したいと思います。

4

2 に答える 2

2

パーセンタイルを計算するときは、自分で計算する方が好きです。ウィンドウ関数を使えば簡単です。SQL Server 2012 を使用している場合は、累積合計が得られ、次のように実行できます。

select itemId, quantity, price, TotalQ, cast(cumQ as float) / TotQ as Percentile
from (select t.*,
             sum(TotalQ) over (partition by ItemId) as TotQ,
             sum(TotalQ) over (partition by itemId order by TotalQ desc) as cumQ
      from t
     ) t

必要に応じて、パーセンタイルに 100 を掛けて切り捨てたり丸めたりすることができます。

SQL Server 2012 がない場合は、相関サブクエリを使用して同じことを行うことができます。

select itemId, quantity, price, TotalQ, cast(cumQ as float) / TotQ as Percentile
from (select t.*,
             sum(TotalQ) over (partition by ItemId) as TotQ,
             (select sum(TotalQ) 
              from t t2
              where t2.itemId = t.ItemId and t2.TotalQ >= t.TotalQ
             ) as cumQ
      from t
     ) t
于 2013-05-16T13:14:22.853 に答える
1

これはうまくいきませんか?

SELECT
   *,
   1E0 * Quantity / TotalQ
FROM
    (
    SELECT 
        *, 
        SUM(Quantity) OVER(PARTITION BY ItemID) AS TotalQ
    FROM
        MyTable
    ) x

または、必要な出力を追加してください

于 2013-05-16T13:14:04.987 に答える