Postgre의 누적 합계 계산SQL
필드의 누적 또는 실행량을 찾아서 스테이징에서 테이블로 삽입하고 싶습니다.제 스테이징 구조는 다음과 같습니다.
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
저는 이 결과를 어떻게 달성해야 할지 매우 혼란스럽습니다.저는 Postgre를 사용하여 이 결과를 얻고 싶습니다.SQL.
이 결과 세트를 달성하는 방법을 제안할 수 있는 사람이 있습니까?
기본적으로 윈도우 기능이 필요합니다.그것은 요즘 표준 기능입니다.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, ea_year, ea_month;
그리고 아니 GROUP BY
.
각 행의 합계는 파티션의 첫 번째 행부터 현재 행까지 계산됩니다. 정확하게는 설명서를 인용합니다.
기본 프레임 옵션은 다음과 같습니다.
RANGE UNBOUNDED PRECEDING
와 같은 것RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
.와 함께ORDER BY
프레임을 파티션 시작부터 현재 행의 마지막 피어까지 모든 행으로 설정합니다.
굵은 글씨로 강조해주세요.이것은 사용자가 추구하는 누적(또는 "실행") 합계입니다.
기본값으로RANGE
모드, 정렬 순서에서 동일한 순위를 가진 행은 "signed" - 동일(circle_id, ea_year, ea_month)
이 질문에모든 피어가 합계에 추가된 상태에서 모든 피어가 동일한 실행 합계에 모든 피어가 추가됩니다.하지만 당신의 테이블은UNIQUE
에(circle_id, ea_year, ea_month)
그러면 정렬 순서가 결정적이고 행에 피어가 없습니다. (그리고 더 저렴한 것을 사용하는 것이 좋습니다.)ROWS
모드).
Postgres 11은 새 옵션이 있는 피어를 포함/제외하기 위한 도구를 추가했습니다.참조:
지금이다,ORDER BY ... ea_month
월 이름에 대한 문자열은 사용할 수 없습니다.Postgres는 로케일 설정에 따라 알파벳 순으로 정렬됩니다.
실제가 있는 경우date
테이블에 저장된 값을 올바르게 정렬할 수 있습니다.만약 그렇지 않다면, 저는 교체하는 것을 제안합니다.ea_year
그리고.ea_month
단란으로the_date
당신의 테이블에 있는 타입의.
다음을 통해 현재의 기능을 혁신할 수:
to_date(ea_year || ea_month , 'YYYYMonth') AS the_date
표시를 위해 다음과 같은 원본 문자열을 얻을 수 있습니다.
to_char(the_date, 'Month') AS ea_month to_char(the_date, 'YYYY') AS ea_year
불행한 디자인을 고수하는 동안, 이것은 다음과 같이 작동할 것입니다.
SELECT ea_month, id, amount, ea_year, circle_id
, sum(amount) OVER (PARTITION BY circle_id ORDER BY the_date) AS cum_amt
FROM (SELECT *, to_date(ea_year || ea_month, 'YYYYMonth') AS the_date FROM tbl) sub
ORDER BY circle_id, mon;
언급URL : https://stackoverflow.com/questions/22841206/calculating-cumulative-sum-in-postgresql
'programing' 카테고리의 다른 글
MongoDB: 비어 있지 않은 문서 배열과 일치 (0) | 2023.05.21 |
---|---|
ASP.NET에서 HTTP Referrer 가져오기 (0) | 2023.05.21 |
새 Git 분기에 현재 변경 내용 삽입 (0) | 2023.05.21 |
고양이를 사용하여 파일의 첫 줄을 읽는 방법은 무엇입니까? (0) | 2023.05.21 |
Tkinter: "Python이 Tk에 대해 구성되지 않았을 수 있습니다." (0) | 2023.05.21 |