2011-12-16 7 views
2

나는 다음과 같은 테이블을했습니다 (모두 AB은 정수) :최대 합

업데이트 1 - 사람이 나에게 부탁을하고 1M의 레코드 집합에 솔루션을 실행할 수 있습니다 B는 N => 10, 100 및 1000의 [0에서 1] 범위에있는 임의의 십진수 (오버플로를 방지하기 위해)입니까? 솔루션 쿼리를 실행하는 데 필요한 시간의 맛을보고 싶습니다. 많은 감사드립니다.

샘플 데이터 : 내가 어떤 N 순차적 A 's의 B 값의 최대 합계를 얻는 방법

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

? 솔루션은 커서를 사용해서는 안되며, 테이블 변수/테이블의 사용은 엄격하게 정당화되어야합니다.

명백한 성능 향상을 제공 할 경우 SQLCLR을 사용할 수 있습니다.

일부 해명 1 개 요소

  • 최대 합계 2 개 요소
  • 최대 합 (A = 4 참조)는도 12의 (그것의 A => 1 & 2 또는 A 중 11이다 => 2 & 3),
  • 3 원소의 최대 합계는 20 (A => 2, 3, 4),
  • 최대 합계는 21입니다 (A => 1,2,3,4 또는 A => 2 , 3,4,5) 등.
+1

당신이 B의 최대 합으로 무엇을 의미합니까, 당신은 예상 된 결과를 포함하는 질문을 업데이트하십시오 할 수 있습니까? –

+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 위해 거기부터 NB 행에 대한 값의 합을 제공한다. 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

@ 마틴 우수 포인트; 업데이트되었습니다. – 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

시도 :

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을하지 않았으므로 일단 모든 솔루션을 시도해보고 세부 사항을 게시 할 것이다. –