Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询-查找超过累计比例的行_Sql_Sql Server_Cumulative Frequency - Fatal编程技术网

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是一个深思熟虑的选择。