SQL 문제풀이 복습
문제 링크
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;