241205_TIL

J Lee·2024년 12월 5일
0

아무리 사소하더라도 배움이 없는 날은 없다.

SQL 문제풀이 복습


Leetcode

문제 링크
간단한 서브쿼리 + 집계함수 활용 문제.

SELECT MAX(total_score) - MIN(total_score) AS "difference_in_score"
FROM   (SELECT student_id,
               assignment1 + assignment2 + assignment3 AS "total_score"
        FROM   Scores) result;

문제 링크
cte 만들 필요 없이 group by + having으로 바로 해결할 수 있음.

SELECT user_id
FROM   Loans
WHERE  loan_type IN ( 'Mortgage', 'Refinance' )
GROUP  BY 1
HAVING COUNT(DISTINCT loan_type) >= 2;

문제 링크
window함수와 집계함수를 써서 연산의 기준이 되는 인라인뷰를 만들고,
거기서부터 다시 case when과 max를 조합해 피벗테이블 형태로 출력하는 문제.
원하는 포맷으로 출력하기 위해서는 concat을 써서 문자열도 제어할 줄 알아야 한다.
여러 개념을 한꺼번에 알고 써야 하는 좋은 문제!

헷갈리지 않도록 ifnull을 가장 바깥단으로 빼 주는 것만 신경쓰자.
window함수를 쓸 때 집계된 결과(sum(points)) 기준으로도
정렬할 수 있다는 것도 기억해 두기.

SELECT country,
       Max(CASE
             WHEN ranking = '1' THEN CONCAT(winery, " (", total_points, ")")
           END)                             AS "top_winery",
       IFNULL(Max(CASE
                    WHEN ranking = '2' THEN CONCAT(winery, " (", total_points,
                                            ")")
                  END), "No second winery") AS "second_winery",
       IFNULL(Max(CASE
                    WHEN ranking = '3' THEN CONCAT(winery, " (", total_points,
                                            ")")
                  END), "No third winery")  AS "third_winery"
FROM   (SELECT country,
               winery,
               Sum(points)                                AS "total_points",
               RANK()
                 OVER(
                   partition BY country
                   ORDER BY Sum(points) DESC, winery ASC) AS "ranking"
        FROM   Wineries
        GROUP  BY 1,
                  2) result
GROUP  BY 1
ORDER  BY 1;
profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보