다음과 같은 10 진수 열이 포함 된 테이블이 있습니다.
id value size
-- ----- ----
1 100 .02
2 99 .38
3 98 .13
4 97 .35
5 96 .15
6 95 .57
7 94 .25
8 93 .15
내가 성취해야 할 것은 설명하기가 조금 어려우므로 제발 참아주십시오. 내가하려는 것은 size
에 따라 내림차순으로 앞의 행이 1까지 합산 될 때마다 1 씩 증가 하는 열의 집계 값을 만드는 것 value
입니다. 결과는 다음과 같습니다.
id value size bucket
-- ----- ---- ------
1 100 .02 1
2 99 .38 1
3 98 .13 1
4 97 .35 1
5 96 .15 2
6 95 .57 2
7 94 .25 2
8 93 .15 3
나의 순진한 첫 번째 시도는 달리기를 유지 한 SUM
다음 CEILING
그 값 을 유지하는 것이었지만 일부 레코드 size
가 총 두 개의 개별 버킷에 기여 하는 경우는 처리하지 않습니다 . 아래 예제는 이것을 명확히 할 수 있습니다.
id value size crude_sum crude_bucket distinct_sum bucket
-- ----- ---- --------- ------------ ------------ ------
1 100 .02 .02 1 .02 1
2 99 .38 .40 1 .40 1
3 98 .13 .53 1 .53 1
4 97 .35 .88 1 .88 1
5 96 .15 1.03 2 .15 2
6 95 .57 1.60 2 .72 2
7 94 .25 1.85 2 .97 2
8 93 .15 2.00 2 .15 3
당신이 볼 수 있듯이 단순히 사용하는 것 인 경우에, CEILING
에 crude_sum
기록 # 8이는에 의해 발생 버킷 (2)에 할당 될 size
두 개의 버킷에 걸쳐 기록 # 5, # 8 인 분할. 대신 이상적인 솔루션은 1에 도달 할 때마다 합계를 재설정하여 bucket
열 을 증가 시키고 현재 레코드 값 SUM
에서 시작하여 새 작업을 시작하는 것 size
입니다. 레코드 순서는이 작업에서 중요하기 때문에 value
열을 내림차순으로 정렬하도록 포함 시켰습니다 .
내 초기 시도는 데이터를 여러 번 통과하고 한 번 SUM
작업 을 수행하고 한 번 더 수행하는 등의 작업 을 수행했습니다 CEILING
. crude_sum
열 을 만들려고 한 예는 다음과 같습니다 .
SELECT
id,
value,
size,
(SELECT TOP 1 SUM(size) FROM table t2 WHERE t2.value<=t1.value) as crude_sum
FROM
table t1
어떤가에 사용 된 UPDATE
이후로 작업하려면 테이블에 값을 삽입하는 작업.
편집 : 이것을 설명 할 때 또 다른 찌르기를 원합니다. 그래서 여기에갑니다. 각 레코드가 실제 항목이라고 가정하십시오. 그 아이템은 그와 관련된 값을 가지고 있으며 물리적 크기는 1보다 작습니다. 볼륨 용량이 정확히 1 인 일련의 버킷이 있으며 필요한 버킷 수와 항목 값에 따라 각 버킷이 들어가는 버킷 수를 결정해야합니다.
물리적 품목은 한 번에 두 곳에 존재할 수 없으므로 한 버킷 또는 다른 버킷에 있어야합니다. 그렇기 CEILING
때문에 누적 합계 + 솔루션을 수행 할 수없는 이유 는 레코드가 두 개의 버킷에 크기를 제공 할 수 있기 때문입니다.
distinct_count
복잡합니다. Aaron Bertrand는 이러한 종류의 윈도우 작업에 대한 SQL Server 옵션에 대한 요약을 제공합니다 . "기발한 업데이트"방법을 사용하여 계산 했습니다. SQL Fiddle 에서 distinct_sum
볼 수 있지만 신뢰할 수 없습니다.