在SQL中查找三个连续值的最大和?

在SQL中查找三个连续值的最大和?,sql,math,azure-sql-database,Sql,Math,Azure Sql Database,假设我有下表,称为收入 id | revenue ------------ 1 | 345 2 | 5673 3 | 0 4 | 45 5 | 4134 6 | 35 7 | 533 8 | 856 9 | 636 10 | 35 我想找到连续3个值分组的最大和。我的意思是: ids 1 + 2 + 3 => 345 + 5673 + 0 = 6018 ids 2 + 3 + 4 => 5673 + 0 + 45 = 5718 i

假设我有下表,称为
收入

id | revenue
------------
1  | 345
2  | 5673
3  | 0
4  | 45
5  | 4134
6  | 35
7  | 533
8  | 856
9  | 636
10 | 35
我想找到连续3个值分组的最大和。我的意思是:

ids  1 + 2 + 3   =>  345  + 5673 + 0    = 6018
ids  2 + 3 + 4   =>  5673 + 0    + 45   = 5718
ids  3 + 4 + 5   =>  0    + 45   + 4134 = 4179
ids  4 + 5 + 6   =>  45   + 4134 + 35   = 4214
ids  5 + 6 + 7   =>  4134 + 35   + 533  = 4702
ids  6 + 7 + 8   =>  35   + 533  + 856  = 1424
ids  7 + 8 + 9   =>  533  + 856  + 636  = 2025
ids  8 + 9 + 10  =>  856  + 636  + 35   = 1527
在本例中,我希望结果是
6018
,因为它是3个连续值的最大和。我刚刚开始学习SQL,之前我唯一的另一种语言是Java,我所能想到的就是使用for循环实现这一点有多容易。有人知道我如何开始编写这样的查询吗?SQL中是否存在类似的情况

编辑:此外,是否可以这样缩放?如果我有一个非常大的表,我想找到100个连续值的最大和,会怎么样

    select rev1,rev2,rev3, rev1.revenue+rev2.revenue+rev3.revenue total_rev from 
revenue rev1,
revenue rev2,
revenue rev3
where rev1.id1+1=rev2.id and rev2.id+1=rev3.id  and total_rev=
(select max(rev1.revenue+rev2.revenue+rev3.revenue) from
revenue rev1,
revenue rev2,
revenue rev3
where rev1.id1+1=rev2.id and rev2.id+1=rev3.id)

一种方法是使用两个连接来获得
id+1
id+2

SELECT max(t1.revenue+t2.revenue+t3.revenue)
FROM revenues t1
JOIN revenues t2 ON t1.id+1 = t2.id
JOIN revenues t3 ON t1.id+2 = t3.id

在SQL Server 2012上提供答案
36018
*

编辑 查询,确保我们只获取由3个收入组成的行:

with t as (
SELECT 1 as id, 345 as rev
UNION SELECT 2, 5673
UNION SELECT 3, 0
UNION SELECT 4, 45
UNION SELECT 5, 4134
UNION SELECT 6, 35
UNION SELECT 7, 533
UNION SELECT 8, 856
UNION SELECT 9, 636
UNION SELECT 10, 35)
SELECT TOP 1 id, r FROM 
  (SELECT  id
    , SUM (rev) OVER (ORDER BY id ROWS 2 PRECEDING) r
    , SUM (1) OVER (ORDER BY id ROWS 2 PRECEDING) cnt
  FROM t) as subslt
WHERE cnt = 3
ORDER BY r desc;


*实际上,在
36018
260018
之间是不确定的。第二个/编辑的查询是确定性的。

如果您的数据库支持
lag()
窗口函数,您可以在单个表扫描中检索结果:

select  max(rev3)
from    (
        select  revenue + 
                    lag(revenue) over (order by id) + 
                    lag(revenue, 2) over (order by id) as rev3
        from    revenues
        ) as SubQueryAlias

什么类型的SQL和什么版本?您有权访问窗口功能()吗?我正在Microsoft Azure云上运行。如果这是唯一的方法,我愿意使用窗口功能,但理想情况下,我想让这个查询尽可能简单,让我能理解,因为我现在真的很不擅长SQL,呵呵。不确定SQL Server是否支持这一点:你在这里做(几乎)所有的id组合,只要求连续的id。回答不错, +1. 但此查询可能返回的行少于2个前导行。问题没有提到这些选项,比如第1行+第2行。很好,我添加了第二个(稍微复杂一点)查询,只排除第1行+第2行。也许您的答案被数据定义模糊了一点?不知道为什么你得不到更多的选票!回答得好,不过这取决于他是否有SQL Server 2012+,尽管这个查询可以很好地扩展,即使你有1亿多行,因为LAG()窗口函数工作得非常好。我非常喜欢这个,因为它看起来很简单!出于好奇,如果我们想找到一个更连续的值的总和,有没有办法重做呢?这种方法似乎效率越低,尝试添加的值越多。@Ralph如果在
id
上有一个索引,则联接的数量将无关紧要,因为每个联接都正好匹配一条记录,可以使用索引非常快速地找到该记录。当您希望连续行数来自某个在编写查询时未知的位置(例如,来自变量)时,这种方法不会进行缩放。
select  max(rev3)
from    (
        select  revenue + 
                    lag(revenue) over (order by id) + 
                    lag(revenue, 2) over (order by id) as rev3
        from    revenues
        ) as SubQueryAlias