안녕을 반복 롤업을 수행하는 방법에나는 합계 (VALY)와 valx의 현재 행 값을 롤링의 이전 행의 값을 기준으로 롤링 합계 (valx의) 수행 할 SQL에서
VALY = previousrow_valy + valx
animal valx valy
cat 1 1
cat 3 4
cat 2 6
dog 4 4
dog 6 10
dog 7 17
dog 8 25
안녕을 반복 롤업을 수행하는 방법에나는 합계 (VALY)와 valx의 현재 행 값을 롤링의 이전 행의 값을 기준으로 롤링 합계 (valx의) 수행 할 SQL에서
VALY = previousrow_valy + valx
animal valx valy
cat 1 1
cat 3 4
cat 2 6
dog 4 4
dog 6 10
dog 7 17
dog 8 25
여기에서 주문을 정의해야합니다.
somecolumn
으로 주문한다고 가정하십시오. Oracle
및 PostgreSQL 8.4
에서
:
SELECT animal, valx, SUM(valx) OVER (PARTITION BY animal ORDER BY somecolumn) AS valy
FROM mytable
MySQL
에서 : SQL Server
에서
SELECT animal, valx,
@valy := CASE WHEN @animal = animal THEN @valy + valx ELSE valx END AS valy,
@animal := animal
FROM (
SELECT @valy = 0,
@animal := NULL
) vars,
mytable
ORDER BY
animal, somecolumn
이는 드문 경우 중 하나는 CURSOR
를 만들 때 것이 더 효율적입니다. 지원 ANSI
구문 (SQL Server
포함)
모든 데이터베이스 :
SELECT animal, valx,
(
SELECT SUM(valx)
FROM mytable mi
WHERE mi.animal = mo.animal
AND mi.somecolumn <= mo.somecolumn
) AS valy
FROM mytable mo
그러나, 이것은 실행 시간은 O(n^2)
사용하는 RDBMS
SQL Server의 마지막 쿼리는 입력 테이블에서와 정확히 동일한 데이터를 반환합니다. –
@Quassnoi 제가 제공 한 대체 접근법을지지하는지 잠시 확인해주십시오. 나는 stackoverflow에 대한 귀하의 작품에 감탄했습니다. –
@ 브라이언 : 대체 어떻게 달라 집니까? – Quassnoi
로 성장,
mytable
에서 레코드가 많은 경우 효율적이지? –oracle 10g를 사용 중입니다. – Arun