0

我有一个 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 回答