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://school.programmers.co.kr/learn/courses/30/lessons/131124
'성장하기 > SQL' 카테고리의 다른 글
[MySQL] COALESCE (0) | 2023.06.13 |
---|---|
[MySQL] WITH RECURSIVE (0) | 2023.06.09 |