241026_TIL

J Lee·2024년 10월 26일
0

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

SQL 문제풀이 복습


Leetcode

문제 링크
1트(7/21)에서는 CTE를 만들어서 풀었는데
오늘은 일부러 CTE 없이 서브쿼리만으로 해결해 봤다.

금메달 획득 수를 늘리고 싶으면
서브쿼리 내의 첫 번째 쿼리에서 3을 다른 값으로 바꾸면 되고,
3개가 아니라 n개 대회 연속으로 메달을 딴 경우를 구하려면
서브쿼리의 제일 마지막 부분의 3을 다른 값으로 바꾸면 된다.

이 문제의 킥은 window함수(이 경우에는 rank)를 써서
n개 대회 연속으로 메달을 딴 케이스를 group by로 묶어주는 것.
그 외에는 서브쿼리와 join의 활용이라서 크게 어려울 건 없다.

SELECT u.NAME,
       u.mail
FROM   Users u
       JOIN (SELECT gold_medal AS "user_id"
             FROM   Contests
             GROUP  BY 1
             HAVING Count(*) >= 3
             UNION
             SELECT DISTINCT medal
             FROM   (SELECT medal,
                            contest_id - RANK()
                                           OVER(
                                             partition BY medal
                                             ORDER BY contest_id) AS "group_id"
                     FROM   (SELECT contest_id,
                                    gold_medal AS "medal"
                             FROM   Contests
                             UNION ALL
                             SELECT contest_id,
                                    silver_medal
                             FROM   Contests
                             UNION ALL
                             SELECT contest_id,
                                    bronze_medal
                             FROM   Contests) a) b
             GROUP  BY medal,
                       group_id
             HAVING Count(*) >= 3) c
         ON u.user_id = c.user_id;

문제 링크

SELECT email
FROM   Person
GROUP  BY 1
HAVING COUNT(*) >= 2;

문제 링크

SELECT customer_id
FROM   Customers
WHERE  year = '2021'
       AND revenue > 0;

프로그래머스

문제 링크
하여간 date_format 엄청 좋아하네;;ㅋㅋ

SELECT BOOK_ID,
       DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS "PUBLISHED_DATE"
FROM   BOOK
WHERE  YEAR(PUBLISHED_DATE) = '2021'
       AND CATEGORY = '인문'
ORDER  BY 2;

문제 링크
그냥 union을 해서 풀면 간단한 거였는데
1트(4/7) 때는 너무 생각이 멀리 돌아갔구나..ㅎㅎ

근데 limit 3을 한다고 그냥 정답 처리되는 게 조금 의아하긴 하다.
판매량의 합이 동률인 경우가 있을 수도 있는데,
문제에서 '판매량의 합이 동률이 나오는 경우는 없다'라고 명시해 주지도 않았기 때문.

따라서 여기서 난이도를 좀 더 높이려면 동률인 경우가 있게끔,
따라서 limit만으로는 해결이 안 되는 케이스를 넣어서
window함수를 쓰게끔 유도할 것 같다는 생각이 든다. (내가 출제자라면?)

SELECT FLAVOR
FROM   (SELECT SHIPMENT_ID,
               FLAVOR,
               TOTAL_ORDER
        FROM   FIRST_HALF
        UNION ALL
        SELECT SHIPMENT_ID,
               FLAVOR,
               TOTAL_ORDER
        FROM   JULY) a
GROUP  BY 1
ORDER  BY SUM(TOTAL_ORDER) DESC
LIMIT  3;

문제 링크
그냥 간단한 join 문제.

SELECT INGREDIENT_TYPE,
       SUM(TOTAL_ORDER) AS "TOTAL_ORDER"
FROM   FIRST_HALF h
       JOIN ICECREAM_INFO i
         ON h.FLAVOR = i.FLAVOR
GROUP  BY 1
ORDER  BY 2;

문제 링크
이것도 걍 간단한 join + where 문제.

SELECT h.FLAVOR
FROM   FIRST_HALF h
       JOIN ICECREAM_INFO i
         ON h.FLAVOR = i.FLAVOR
WHERE  TOTAL_ORDER > 3000
       AND INGREDIENT_TYPE = 'fruit_based'
ORDER  BY TOTAL_ORDER DESC;

문제 링크

SELECT FLAVOR
FROM   FIRST_HALF
ORDER  BY TOTAL_ORDER DESC,
          SHIPMENT_ID ASC;
profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보