Programming/SQL

[프로그래머스 SQL 고득점 kit] 그룹별 조건에 맞는 식당 목록 출력하기

용스토리랜드 2024. 7. 22. 19:59

💡문제 설명

💡문제

MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.

💡예시

 

💡풀이

 

SELECT 
    A.MEMBER_NAME,
    B.REVIEW_TEXT,
    DATE_FORMAT(B.REVIEW_DATE, "%Y-%m-%d") AS REVIEW_DATE
FROM MEMBER_PROFILE A join REST_REVIEW B USING (MEMBER_ID)
WHERE A.MEMBER_ID = (SELECT MEMBER_ID 
                     FROM REST_REVIEW
                     GROUP BY MEMBER_ID
                     ORDER BY COUNT(*) DESC 
                     LIMIT 1)
ORDER BY REVIEW_DATE, REVIEW_TEXT

 

쿼리 주요 단계 

  • 서브쿼리 사용: REST_REVIEW 테이블에서 회원별 리뷰 수를 계산하고, 가장 많은 리뷰를 작성한 MEMBER_ID를 선택합니다.
  • JOIN: MEMBER_PROFILE 테이블과 REST_REVIEW 테이블을 MEMBER_ID로 조인합니다.
  • 필터링: 서브쿼리에서 얻은 MEMBER_ID를 사용하여 가장 많이 리뷰를 작성한 회원의 리뷰를 필터링합니다.
  • 정렬: 리뷰 날짜와 텍스트를 기준으로 결과를 정렬합니다.

 

SELECT P.MEMBER_NAME, R.REVIEW_TEXT, DATE_FORMAT(R.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM (SELECT *,
      COUNT(MEMBER_ID) OVER(PARTITION BY MEMBER_ID) AS COUNT_REVIEW
      FROM REST_REVIEW) AS R
JOIN MEMBER_PROFILE AS P ON R.MEMBER_ID = P.MEMBER_ID
WHERE COUNT_REVIEW = (
    SELECT COUNT(MEMBER_ID) OVER(PARTITION BY MEMBER_ID) AS C
    FROM REST_REVIEW
    ORDER BY C DESC
    LIMIT 1)
ORDER BY REVIEW_DATE, REVIEW_TEXT;

 

쿼리 주요 단계 

 

  • 윈도우 함수 사용: COUNT(MEMBER_ID) OVER(PARTITION BY MEMBER_ID)를 사용하여 각 회원의 리뷰 수를 계산합니다.
  • 서브쿼리 사용: PARTITION BY를 사용한 결과에서 최대 리뷰 수를 찾습니다.
  • JOIN: MEMBER_PROFILE 테이블과 REST_REVIEW 테이블을 MEMBER_ID로 조인합니다.
  • 필터링: 최대 리뷰 수와 일치하는 회원의 리뷰를 필터링합니다.
  • 정렬: 리뷰 날짜와 텍스트를 기준으로 결과를 정렬합니다.

💡비교

 

  • 첫 번째 쿼리: 단일 회원을 대상으로 하며, 가장 많은 리뷰를 작성한 단일 회원만 선택합니다.
  • 두 번째 쿼리: 여러 회원을 대상으로 하며, 가장 많은 리뷰를 작성한 모든 회원을 선택합니다. 즉, 리뷰 수가 동일한 여러 회원이 있을 경우 모두 선택됩니다.

💡Window 함수 ?

윈도우 함수의 정의와 이름의 유래

윈도우 함수(Window Function)는 SQL에서 각 행을 기준으로 데이터의 "윈도우" 또는 "프레임" 내에서 계산을 수행하는 함수입니다. 여기서 "윈도우"라는 이름이 붙은 이유는, 이 함수가 결과 집합의 각 행을 중심으로 특정 범위(윈도우)를 지정하고, 그 범위 내의 데이터에 대해 연산을 수행하기 때문입니다.

 

윈도우 함수의 특징과 동작 방식

  1. 범위 지정: 윈도우 함수는 OVER 절을 사용하여 각 행에 대해 계산할 범위를 지정합니다. 이 범위는 PARTITION BY와 ORDER BY 절을 사용하여 정의됩니다.
  2. 행 유지: 그룹별 집계 함수(GROUP BY)와는 달리, 윈도우 함수는 원본 데이터의 각 행을 그대로 유지하면서 집계 결과를 계산합니다.
  3. 동적 계산: 윈도우 함수는 데이터의 특정 부분을 동적으로 집계합니다. 예를 들어, 누적 합계, 이동 평균, 순위 계산 등이 가능합니다.

윈도우 함수의 주요 구성 요소

  1. PARTITION BY: 데이터 집합을 특정 열을 기준으로 분할하여, 각 파티션 내에서 별도로 계산을 수행합니다. PARTITION BY가 없으면 전체 데이터 집합을 하나의 파티션으로 간주합니다.
  2. ORDER BY: 각 파티션 내에서 데이터를 정렬하여 계산 순서를 지정합니다. 예를 들어, 날짜 순서대로 정렬하여 누적 합계를 계산할 수 있습니다.
  3. 윈도우 프레임: ROWS 또는 RANGE 옵션을 사용하여 현재 행을 기준으로 특정 범위(프레임)를 지정할 수 있습니다.

 

 

반응형