> 데이터 베이스 > MySQL 튜토리얼 > GROUP BY 절과 함께 PostgreSQL 창 함수를 올바르게 사용하는 방법은 무엇입니까?

GROUP BY 절과 함께 PostgreSQL 창 함수를 올바르게 사용하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-06 11:33:45
원래의
514명이 탐색했습니다.

How to Correctly Use PostgreSQL Window Functions with GROUP BY Clauses?

PostgreSQL 창 함수 및 Group By 예외

PostgreSQL에서 GROUP BY 절과 함께 창 함수를 사용하려고 할 때 두 창 함수의 차이점을 이해하는 것이 중요합니다. 둘. 창 함수는 행을 단일 값으로 요약하는 집계 함수와 달리 테이블 데이터의 파티션에서 작동하여 모든 행을 유지하면서 여러 행에 걸쳐 계산을 수행합니다. 따라서 윈도우 함수를 사용할 때에는 GROUP BY 절에 분할된 컬럼을 포함시키는 것이 필수입니다.

문제 설명

제공된 쿼리에서 사용자가 다음을 실행하려고 하면 오류가 발생합니다. 코드:

SELECT p.name, e.date, 
    sum(sp.payout) OVER (ORDER BY e.date)
    - sum(s.buyin) OVER (ORDER BY e.date) AS "Profit/Loss" 
FROM result r 
    JOIN game g ON r.game_id = g.game_id 
    JOIN event e ON g.event_id = e.event_id 
    JOIN structure s ON g.structure_id = s.structure_id 
    JOIN structure_payout sp ON g.structure_id = sp.structure_id
                            AND r.position = sp.position 
    JOIN player p ON r.player_id = p.player_id 
WHERE p.player_id = 17 
GROUP BY p.name, e.date, e.event_id, sp.payout, s.buyin
ORDER BY p.name, e.date ASC
로그인 후 복사

창 기능 때문에 오류가 발생합니다. sum(sp.payout) OVER (ORDER BY e.date) 및 sum(s.buyin) OVER (ORDER BY e.date)에는 집계 함수가 수반되지 않습니다. 결과적으로 PostgreSQL에서는 분할된 열 sp.payout 및 s.buyin이 GROUP BY 절에 포함되도록 요구합니다.

해결책

이 문제를 해결하려면 사용자는 다음 중 하나를 수행할 수 있습니다.

  1. 그룹에 sp.payout 및 s.buyin 포함 BY 절:
GROUP BY p.name, e.date, e.event_id
로그인 후 복사

그러나 이 접근 방식은 sp.payout 또는 s.buyin 값이 여러 개 있는 경우 각 플레이어 및 이벤트에 대해 여러 행으로 이어질 수 있습니다.

  1. 창 기능과 집계의 조합을 사용합니다. 함수:
SELECT p.name
     , e.event_id
     , e.date
     , sum(sum(sp.payout)) OVER w
     - sum(sum(s.buyin  )) OVER w AS "Profit/Loss" 
FROM   player            p
JOIN   result            r ON r.player_id     = p.player_id  
JOIN   game              g ON g.game_id       = r.game_id 
JOIN   event             e ON e.event_id      = g.event_id 
JOIN   structure         s ON s.structure_id  = g.structure_id 
JOIN   structure_payout sp ON sp.structure_id = g.structure_id
                          AND sp.position     = r.position
WHERE  p.player_id = 17 
GROUP  BY e.event_id
WINDOW w AS (ORDER BY e.date, e.event_id)
ORDER  BY e.date, e.event_id;
로그인 후 복사

이 예에서 sum(sum(sp.payout)) OVER w 및 sum(sum(s.buyin)) OVER w 표현식은 외부 창을 결합합니다. 내부 집계 함수를 사용하여 이벤트당 총 지불금 및 바이인을 계산합니다.

위 내용은 GROUP BY 절과 함께 PostgreSQL 창 함수를 올바르게 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿