2011-12-16 12 views
2

I次の表をしました(両方ABは整数):最大合計

アップデート1 - 誰も私に好意を行うと1Mレコードのセットに解決策を実行することができますBはN => 10,100、および1000の[0〜1]の範囲にあるランダムな小数(オーバーフローを避けるため)です。私は、ソリューションのクエリを実行するために必要な、時間の風味を取得したいと思います。ありがとうございます。

サンプルデータ:

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

にはどうすれば任意のNシーケンシャルA「sのB値の最大合計を得るのですか?ソリューションはカーソルを使用してはならないので、テーブル・バー/テン・テーブルの使用は厳格に正当化されなければならない。

パフォーマンスが大幅に向上する場合は、SQLCLRを使用できます。

いくつかの明確化:1つの要素の

  • 最大合計は11である(A = 4参照)
  • 最大合計2つの要素12である(これはA => 1 & 2又はA => 2のいずれかです& 3)、
  • 3要素の最大合計は20(A => 2,3,4)、
  • 最大合計は21です(A => 1,2,3,4またはA => 2 、3,4,5)など。
+1

、あなたが期待される結果を含めるように質問を更新してくださいすることができますか? –

+0

これは宿題かもしれませんか? –

+1

おそらくN = 3の場合、答えは8 + 1 + 11 = 24ですか? –

答えて

2

。だから、

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のために、そこに開始N行のB値の合計を提供します。 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

RE:整数のうちのいくつかが負の場合、あなたは「心配する必要はありませんか? –

+0

@ Martin優れた点;更新しました。 – AakashM

+0

@Martin Smith絶対にそうではありません。 –

0

正しくない場合は、少し説明がより可能

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

...私はおそらく完全に質問を理解していないんだけど、それはのように私には見えますか?

+0

投稿した追加情報をお読みください。 –

1

テストデータをdataという表にロードしました。

次のSQLは、N = 3のために私に答え20を与える:

A値は、我々は我々が興味を持っている値は、特定の Aのために知って N与えられ、連続した整数であることが保証されているので
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 
+0

ありがとう、それを試してみてください。パフォーマンスはどのように「クロス」ですか?大規模なNを探すことはめったにありませんが、テーブルのサイズは1M ++の行にすることができます。 –

+0

'N'の値が大きい場合、これとAkashの答えは、同じ値を繰り返し再計算するという点で、実行中の合計の計算と同様の問題を抱えています。 –

+0

@MartinSmith:各行はN個の合計に含まれなければならない - はい、それは0(N)問題である。どのようにそれがそうであるかもしれないかに興味があるでしょう。 (スケールの問題は質問では規定されていないことに注意してください) –

1

試してください:あなたはBの合計の最大値とはどういう意味ですか

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 
+0

私はここでSqlをしていない、私はすべてのソリューションを試してみると詳細を投稿します。 –

関連する問題