SQL查询 - 查找超出累积比例的行

时间:2011-10-27 10:23:24

标签: sql sql-server cumulative-frequency

假设我有一个数据表,如下所示:

ItemNo    |    ItemCount   |    Proportion
------------------------------------------
1              3                0.15 
2              2                0.10
3              3                0.15
4              0                0.00
5              2                0.10
6              1                0.05
7              5                0.25
8              4                0.20

换句话说,总共有20个项目,每个ItemNo的累计比例总和为100%。表行的顺序在这里很重要。

是否可以执行SQL查询 没有循环或游标 以返回超出累积比例的第一个 ItemNo

换句话说,如果我要检查的'比例'是35%,那么超过该比例的第一行是ItemNo 3,因为0.15 + 0.10 + 0.15 = 0.40

同样,如果我想找到超过75%的第一行,那将是ItemNo 7,因为直到该行的所有Proportion的总和小于0.75。

2 个答案:

答案 0 :(得分:5)

select top 1
  t1.ItemNo
from
  MyTable t1
where
  ((select sum(t2.Proportion) from MyTable t2 where t2.ItemNo <= t1.ItemNo) >= 0.35)
order by
  t1.ItemNo

答案 1 :(得分:3)

窗口函数的经典之作:

SELECT * 
FROM   (
    SELECT ItemNo
          ,ItemCount
          ,sum(Proportion) OVER (ORDER BY ItemNo) AS running_sum
    FROM   tbl) y
WHERE  running_sum > 0.35
LIMIT  1;

适用于 PostgreSQL 等。

或者,在 tSQL 表示法中(您似乎使用):
SELECT TOP 1 *
FROM(
    SELECT ItemNo
          ,ItemCount中
          ,sum(比例)OVER(ORDER BY ItemNo)AS running_sum
    从tbl)y
WHERE running_sum&gt; 0.35;

在tSQL中不起作用,如下所示。