PostgreSQL에서 누적 합계 계산
필드의 누적 또는 실행 량을 찾아 스테이징에서 테이블로 삽입하고 싶습니다. 내 스테이징 구조는 다음과 같습니다.
ea_month id amount ea_year circle_id
April 92570 1000 2014 1
April 92571 3000 2014 2
April 92572 2000 2014 3
March 92573 3000 2014 1
March 92574 2500 2014 2
March 92575 3750 2014 3
February 92576 2000 2014 1
February 92577 2500 2014 2
February 92578 1450 2014 3
내 대상 테이블이 다음과 같이 보이기를 원합니다.
ea_month id amount ea_year circle_id cum_amt
February 92576 1000 2014 1 1000
March 92573 3000 2014 1 4000
April 92570 2000 2014 1 6000
February 92577 3000 2014 2 3000
March 92574 2500 2014 2 5500
April 92571 3750 2014 2 9250
February 92578 2000 2014 3 2000
March 92575 2500 2014 3 4500
April 92572 1450 2014 3 5950
이 결과를 달성하는 방법에 대해 정말 혼란 스럽습니다. PostgreSQL을 사용하여이 결과를 얻고 싶습니다.
누구든지이 결과 세트를 달성하는 방법을 제안 할 수 있습니까?
기본적으로 여기에 창 기능 이 필요합니다 . 그것은 오늘날 표준 기능입니다. 정품 창 함수 외에도 절 을 추가하여 Postgres에서 모든 집계 함수를 창 함수로 사용할 수 있습니다 OVER
.
여기서 특별한 어려움은 파티션과 정렬 순서를 올바르게 얻는 것입니다.
SELECT ea_month, id, amount, ea_year, circle_id
, sum(amount) OVER (PARTITION BY circle_id ORDER BY ea_year, ea_month) AS cum_amt
FROM tbl
ORDER BY circle_id, month;
그리고 여기 없습니다 GROUP BY
.
각 행의 합계는 파티션의 첫 번째 행에서 현재 행까지 계산되거나 정확한 매뉴얼 을 인용 합니다 .
기본 프레임 옵션은
RANGE UNBOUNDED PRECEDING
동일하다,RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. 를 사용 하면 파티션의 모든 행이 현재 행의 마지막 피어를 통해 시작ORDER BY
되도록 프레임을 설정합니다 .ORDER BY
... 그것은 당신이 추구하는 누적 또는 누적 합계입니다. 대담하게 강조합니다.
같은과 행이 (circle_id, ea_year, ea_month)
있다 "동료" 이 쿼리한다. 이들 모두는 합계에 모든 피어가 추가 된 동일한 누적 합계를 보여줍니다. 그러나 귀하의 테이블이 UNIQUE
on 이라고 가정 (circle_id, ea_year, ea_month)
하면 정렬 순서가 결정적이며 어떤 행에도 피어가 없습니다.
이제 ORDER BY ... ea_month
월 이름에 대한 문자열에서는 작동하지 않습니다 . Postgres는 로케일 설정에 따라 알파벳순으로 정렬합니다.
date
테이블에 실제 값이 저장되어 있으면 적절하게 정렬 할 수 있습니다. 그렇지 않으면, 나는 대체하는 것이 좋습니다 ea_year
및 ea_month
단일 컬럼 mon
유형의 date
테이블입니다.
당신이 가진 것을 변화 시키십시오
to_date()
:to_date(ea_year || ea_month , 'YYYYMonth') AS mon
디스플레이를 위해 다음을 사용하여 원본 문자열을 얻을 수 있습니다
to_char()
.to_char(mon, 'Month') AS ea_month to_char(mon, 'YYYY') AS ea_year
불행한 레이아웃에 갇혀 있지만 이것은 작동합니다.
SELECT ea_month, id, amount, ea_year, circle_id
, sum(amount) OVER (PARTITION BY circle_id ORDER BY mon) AS cum_amt
FROM (SELECT *, to_date(ea_year || ea_month, 'YYYYMonth') AS mon FROM tbl)
ORDER BY circle_id, mon;
참고 URL : https://stackoverflow.com/questions/22841206/calculating-cumulative-sum-in-postgresql
'Program Tip' 카테고리의 다른 글
Git : 어떤 커밋이 줄의 범위에 닿았는지 발견 (0) | 2020.12.08 |
---|---|
UINavigationController를 사용하지 않고 Storyboard에서 UINavigationBar의 높이를 변경하는 방법이 있습니까? (0) | 2020.12.08 |
dockerfile을 통해 docker 이미지를 빌드하는 동안 cmd 행을 통해 ENV 변수를 전달할 수 있습니까? (0) | 2020.12.08 |
Go에서 2D 슬라이스를 만드는 간결한 방법은 무엇입니까? (0) | 2020.12.08 |
문자열 상수와 문자열 리터럴의 차이점은 무엇입니까? (0) | 2020.12.08 |