2011-10-27 26 views
3

说我有,看起来数据表所示:SQL查询 - 找到一行超过累积比例

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。

回答

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 
+0

到目前为止在测试中工作 - 谢谢 – Widor

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货号
,ItemCount中
,SUM(比例)OVER(ORDER BY货号)AS running_sum
FROM tbl)y
WHERE running_sum> 0.35;

在下面的注释中,在tSQL中不起作用。

+0

在Sql Server中使用的语法有细微差别吗?在使用第二个示例时,我会在'order'附近获得错误的语法。' – Widor

+0

虽然我可能弄错了,但我不认为OVER子句可用于在SQL Server中生成运行总计,只有排名或对分区的总和。请参阅http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sqlserver/861073#861073这就是我选择子查询的原因。 – njr101

+0

@ njreed.myopenid.com:啊,看起来你是对的,不适用于tSQL。良好的联系。我删掉了tSQL版本。请记住在你的巢问题中公开你的RDBMS。 :) –