본문 바로가기
성장하기/SQL

[MySQL] OVER

by 솔로 슈퍼스타 2023. 6. 13.
728x90

OVER Clause

; The OVER clause in MySQL is used with the PARTITION BY clause to break the data into partitions. Following is the syntax of the OVER clause in MySQL.

<function> OVER (   
       [ <PARTITION BY clause> ]  
       [ <ORDER BY clause> ]   
       [ <ROW or RANGE clause> ]  
      )

프로그래머스의 SQL 고득점 Kit에 출제된 문제의 My SQL 솔루션 중 하나입니다.

(문제 참조는 https://school.programmers.co.kr/learn/courses/30/lessons/131124)

SELECT MEMBER_NAME, REVIEW_TEXT, DATE_FORMAT(REVIEW_DATE, "%Y-%m-%d") AS REVIEW_DATE
FROM MEMBER_PROFILE 
JOIN 
    (SELECT MEMBER_ID, REVIEW_TEXT,	REVIEW_DATE,
        COUNT(MEMBER_ID) OVER (PARTITION BY MEMBER_ID ) AS REVIEW_COUNT
        FROM REST_REVIEW) AS REST_REVIEW
ON MEMBER_PROFILE.MEMBER_ID = REST_REVIEW.MEMBER_ID
WHERE REVIEW_COUNT = 
    (SELECT COUNT(*) FROM REST_REVIEW
        GROUP BY MEMBER_ID
        ORDER BY COUNT(*) DESC LIMIT 1)
ORDER BY REVIEW_DATE, REVIEW_TEXT

이 쿼리는 MEMBER_PROFILE 및 REST_REVIEW라는 두 개의 테이블을 사용하여 데이터를 가져옵니다.

1. REST_REVIEW 하위 쿼리를 먼저 작성합니다. 이 쿼리는 REST_REVIEW 테이블에서 MEMBER_ID, REVIEW_TEXT, REVIEW_DATE를 선택하고, MEMBER_ID로 파티션을 나눈 후 각 멤버별로 리뷰의 개수를 계산합니다. 이 계산된 리뷰 개수를 REVIEW_COUNT라는 별칭으로 지정합니다.

 

2. MEMBER_PROFILE 테이블과 1에서 만든 REST_REVIEW 테이블을 조인합니다. 이를 위해 MEMBER_PROFILE 테이블의 MEMBER_ID와 REST_REVIEW 테이블의 MEMBER_ID를 사용합니다.

3. 그 다음, 상위 쿼리에서는 REVIEW_COUNT가 (하위 쿼리에서 계산된) 리뷰 개수의 최댓값과 동일한 레코드만 선택합니다. 이는 가장 많은 리뷰를 작성한 멤버를 찾는 것입니다.

4. 최종적으로, 선택된 멤버들의 MEMBER_NAME, REVIEW_TEXT, REVIEW_DATE(날짜를 "YYYY-MM-DD" 형식으로 변환)를 가져옵니다. 결과는 REVIEW_DATE 및 REVIEW_TEXT의 오름차순으로 정렬됩니다.

 

[출처]

https://dotnettutorials.net/lesson/over-clause-in-mysql/#:~:text=The%20OVER%20clause%20in%20MySQL%20is%20used%20with%20the%20PARTITION,to%20operate%20for%20each%20partition.

https://school.programmers.co.kr/learn/courses/30/lessons/131124

 

'성장하기 > SQL' 카테고리의 다른 글

[MySQL] COALESCE  (0) 2023.06.13
[MySQL] WITH RECURSIVE  (0) 2023.06.09