3

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

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 30.15 + 0.10 + 0.15 = 0.40

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

4

2 回答 2

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
于 2011-10-27T10:28:36.257 回答
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(Proportion) OVER (ORDER BY ItemNo) AS running_sum
FROM tbl) y
WHERE running_sum > 0.35;

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

于 2011-10-27T10:34:09.200 回答