连续N行的最大总和

时间:2011-12-16 15:06:55

标签: sql sql-server sql-server-2008 tsql sqlclr

我有下表(AB都是整数):

更新1 - 任何人都可以帮我一个忙,并在一组1M记录上运行解决方案,其中B是一个随机小数(以避免溢出),驻留在N的[0到1]范围内=> 10,100和1000?我想了解运行解决方案查询所需的时间。非常感谢。

示例数据:

A   B
1   1
2   8
3   1
4   11
5   1
6   1
7   6
8   1
9   1
10  2

如何获得N个连续B的最大A值总和?该解决方案不得使用游标,表vars / tem表的使用必须非常合理。

如果能够提供明显的性能提升,我可以使用SQLCLR。

一些澄清:

  • 1个元素的最大总和为11(参见A = 4)
  • 2个元素的最大总和为12(它是A => 1& 2或A => 2& 3),
  • 3个元素的最大总和为20(A => 2,3,4),
  • 4的最大总和为21(A => 1,2,3,4或A => 2,3,4,5)等。

4 个答案:

答案 0 :(得分:2)

由于A值保证为连续整数,给定N我们知道任何特定A我们感兴趣的值。所以

SELECT
    A,
    (SELECT SUM(B) FROM Table T2 WHERE T.A <= T2.A AND T2.A <= T.A + N - 1) 
        AS SumOfBs
FROM Table T
WHERE A + N - 1 <= (SELECT COUNT(*) FROM Table)

为每个A提供从那里开始的B行的N值的总和。 WHERE将我们限制为从那里开始实际拥有N行的行。把它放在子查询中,我们可以得到最大值:

SELECT 
    MAX(SumOfBs) AS DesiredValue
FROM
(
    SELECT
        A,
        (SELECT SUM(B) FROM Table T2 WHERE T.A <= T2.A AND T2.A <= T.A + N - 1) 
            AS SumOfBs
    FROM Table T
    WHERE A + N - 1 <= (SELECT COUNT(*) FROM Table)
) Intermediate

应该做的。

答案 1 :(得分:1)

我已将测试数据加载到名为data的表中。

以下SQL为我提供了N = 3的答案20

declare @N int
set @N = 3

select max(SumB)
from data d
cross apply (select SumB = SUM(B) from data sub where sub.A between d.A - (@N-1) and d.A) x

答案 2 :(得分:1)

尝试:

with cte as 
(select 1 window_count union all
 select window_count+1 window_count from cte where window_count<@N)
select max(sum_B) from
(select T1.A,
       sum(T2.B) sum_B
 from MyTable T1
 cross join cte
 join MyTable T2 on T1.A = T2.A + cte.window_count - 1
 group by T1.A) sq

答案 3 :(得分:0)

我可能不完全理解这个问题,但它看起来像......

SELECT SUM(B) FROM table WHERE A <= n

如果不正确,你能解释一下吗?