inflearn logo
강의

Course

Instructor

The final step for SQL coding test

리뷰를 가장 많이 작성한 회원들 조회

5

abdortus159

1 asked

0

안녕하세요 최근에 코테를 봤었는데,

비슷한 문제가 프로그래머스에 있어서 어떤 로직이 맞는지 궁금해서 질문을 남깁니다

 

프로그래머스의 문제는 SQL 고득점 kit에 있는 "그룹별 조건에 맞는 식당 목록 출력하기" 입니다.

 

MySQL로 진행했고, 리뷰를 가장 많이 작성한 멤버id를 구하기위해 서브쿼리를 작성후 rnk=1을 사용했습니다. 이후, 리뷰 가장 많이 작성한 멤버가 여러명일 수 있으므로 바깥에서 in을 사용하여 최종적으로 order by로 정렬했습니다.

SELECT 
    MEMBER_NAME, 
    REVIEW_TEXT, 
    DATE_FORMAT(REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM REST_REVIEW r
INNER JOIN MEMBER_PROFILE m
ON r.MEMBER_ID = m.MEMBER_ID
WHERE r.MEMBER_ID IN (
    SELECT MEMBER_ID
    FROM(
        SELECT 
            MEMBER_ID,
            COUNT(MEMBER_ID),
            RANK() OVER(ORDER BY COUNT(MEMBER_ID) DESC) AS RNK
        FROM REST_REVIEW
        GROUP BY MEMBER_ID
    ) AS A
    WHERE RNK = 1
)
ORDER BY REVIEW_DATE, REVIEW_TEXT

 

최근 코테에서는 가장 높은 점수를 가진 회원의 부서ID를 구해야 하는 문제였고, 가장 높은 점수를 가진 회원이 여러명 일 경우 모두 출력하라고 명시되어있었습니다.

해당 코테에서도 rank() over (order by score desc)를 쓰고 바깥에서 rnk=1인 회원id를 구해 본 테이블과 join을 하는 로직으로 풀었는데

이렇게 접근하는게 맞는지 궁금합니다.

sql mysql 코딩-테스트 프로그래머스

Answer 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

SQL 코딩과 관련한 문제에서, 리뷰를 가장 많이 작성한 회원이나 가장 높은 점수를 가진 회원을 찾는 과정에서 RANK() 함수를 사용하는 접근 방식은 적절한 방법입니다. RANK() 함수와 함께 서브쿼리를 이용해 조건에 맞는 결과를 추출하고, 이를 외부 쿼리에서 필터링하여 최종 결과를 얻어내는 방식은 SQL에서 매우 유용한 패턴입니다.

질문에서 언급하신 로직은 일반적인 데이터베이스 쿼리에서 특정 그룹 내에서 최대값을 가진 레코드를 추출할 때 흔히 사용됩니다. 특히, 동일한 최대값을 가진 여러 레코드가 있을 경우, RANK() 함수를 통해 순위를 기준으로 필터링할 수 있어 편리합니다.

현재 작성해주신 쿼리에서는 리뷰를 가장 많이 작성한 회원을 정확히 찾기 위해 RANK() 함수와 IN 연산자를 함께 사용하셨습니다.
아래는 현재 구조대로 예상되는 쿼리의 흐름입니다:
- 내부 중첩 쿼리에서 each 회원의 리뷰 수를 계산하고, RANK() 함수로 순위를 매깁니다.
- RANK()가 1인 회원들을 외부 쿼리에서 필터링하여 출력합니다.
- 필요한 정보는 최종적으로 INNER JOIN을 통해서 가져오며, 정렬 기준(ORDER BY)은 각 리뷰의 작성일과 내용입니다.

해당 방법은 로직적으로 맞습니다. 다만, 만약 RANK() 대신 DENSE_RANK() 혹은 ROW_NUMBER()가 더 적합할 수 있는 케이스가 발생할 수 있으므로 문제의 조건을 정확히 체크하시면 좋습니다.

이해를 돕기 위해 참고할 만한 유사한 질문이 있습니다. 동일한 컨셉을 바탕으로 데이터베이스 쿼리를 최적화하거나 다른 방법으로 구현한 예를 확인하실 수 있습니다:
- SQL 고득점 kit 관련 질문

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

회사 내 AI 툴 사용에 대한 질문

0

15

1

일대일 fk 위치

0

21

1

GROUP BY, HAVING 실습 1번문제

1

19

2

4 - A

0

24

2

코딩 테스트 All-in-One(Java)' 강의 노션 교재 권한문의

0

19

1

수업에서 사용하는 툴 질문드려요

0

28

2

태어난김에 세계일주 시간 초과

0

19

1

2강에 파일 어디있을까여,,

0

20

2

커리큘럼 중 정렬 관련 질문

0

18

1

다음 강의는 언제쯤 나올까요?

0

28

2

코딩살구클럽 입장이 안됩니다

0

62

2

땃지님 실습소 DB서버 확인 부탁드립니다

0

25

2

코테 사이트 로그인 불가

0

25

1

마인드맵 사용 프로그램

0

20

1

엔터티 종류

0

23

2

제 3 정규형 vs BCNF 정규형 차이점?

0

35

3

XAMPP에서 Apache, DB 재기동 시 접속안되는 문제

0

17

1

4-F 경우의 수 질문입니다.

0

32

2

DESC, ASC

0

29

2

코딩살구클럽 가입이 안됩니다.

0

75

2

실습 권한이 없네요··· 이건 ··· 좀··· 401 에러떠요

0

29

3

LAG, LEAD 강의 550. Game Play Analysis IV 관련 질문

1

165

2

Date 강의 / leetcode 1321 질문

1

198

1

lag, leag 강의에서 game-play-analysis-iv 문제

1

408

2