我有下表(A
和B
都是整数):
更新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。
一些澄清:
答案 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
如果不正确,你能解释一下吗?