programing

Postgre의 누적 합계 계산SQL

kingscode 2023. 5. 21. 14:46
반응형

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

반응형