SQL查询-查找超过累计比例的行
假设我有一个数据表,如下所示:SQL查询-查找超过累计比例的行,sql,sql-server,cumulative-frequency,Sql,Sql Server,Cumulative Frequency,假设我有一个数据表,如下所示: ItemNo | ItemCount | Proportion ------------------------------------------ 1 3 0.15 2 2 0.10 3 3 0.15 4 0 0.00
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个项目,每个项目的累计比例为100%。表行的顺序在这里很重要
是否可以在不使用循环或游标的情况下执行SQL查询,以返回超过累计比例的第一个ItemNo
换句话说,如果我想检查的“比例”是35%,那么超过这个比例的第一行就是第3项,因为0.15+0.10+0.15=0.40
类似地,如果我想找到超过75%的第一行,那将是ItemNo 7,作为所有比例的总和,直到该行小于0.75。窗口函数的经典:
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
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表示法中:
选择前1名*
从…起
选择项目编号
,ItemCount
,按ItemNo计算的订单上的sum比例作为运行总和
来自tbl y
其中运行_和>0.35
在tSQL中不起作用,如下所述。在Sql Server中使用的语法是否有细微的差别?在使用第二个示例时,我在“order”附近得到了不正确的语法。我可能弄错了,但我认为OVER子句不能用于在SQL Server中生成运行总计,只能生成分区上的排名或总和。这就是我为什么选择子查询的原因。@njreed.myopenid.com:啊,看起来你是对的,不适用于tSQL。好链接。我划掉了tSQL版本。请记住在下一个问题中披露您的RDBMS:@欧文:谢谢你的澄清。为了获得一个通用的SQL解决方案而不需要依赖于特定于供应商的功能,不指定RDBMS是一个深思熟虑的选择。