복붙노트

[SQL] PostgreSQL의에서 누적 합계를 계산

SQL

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을 사용하여이 결과를 달성하고자합니다.

사람이 결과 세트를 달성 대해 이동하는 방법을 제안 할 수 있습니다?

해결법

  1. ==============================

    1.기본적으로, 당신은 여기에 윈도우 함수가 필요합니다. 즉 현재의 표준 기능입니다. 정품 윈도우 함수뿐만 아니라, 당신은 OVER 절을 추가하여 포스트 그레스에서 윈도우 함수와 같은 집계 함수를 사용할 수 있습니다.

    기본적으로, 당신은 여기에 윈도우 함수가 필요합니다. 즉 현재의 표준 기능입니다. 정품 윈도우 함수뿐만 아니라, 당신은 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.

    각 행의 합은 현재 행에 파티션의 첫 번째 행으로부터 계산된다 - 또는 매뉴얼을 인용하는 것으로 정확한 :

    ... 당신이 후하다 누적 또는 누적 합계이다. 굵게 강조 광산.

    같은 (circle_id, ea_year, ea_month)와 행이 쿼리에서 "동료들"입니다. 그 모든 합계에 추가 된 모든 동료들과 같은 실행 합계를 보여줍니다. 그러나 나는 당신의 테이블에 UNIQUE (circle_id, ea_year, ea_month) 가정, 다음 정렬 순서가 결정하고 어떤 행 동료가 없습니다.

    이제 BY ... ea_month ORDER 달 이름에 대한 문자열이 작동하지 않습니다. 포스트 그레스는 로케일 설정에 따라 알파벳 순으로 정렬 할 것입니다.

    당신이 당신의 테이블에 저장된 실제 날짜 값이있는 경우 제대로 정렬 할 수 있습니다. 그렇지 않으면, 당신의 테이블에 입력 한 날짜의 단일 컬럼 월에 ea_year 및 ea_month를 교체하는 것이 좋습니다.

    불행한 레이아웃 붙어 있지만,이 작동합니다 :

    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;
    
  2. from https://stackoverflow.com/questions/22841206/calculating-cumulative-sum-in-postgresql by cc-by-sa and MIT license