SQL 문제풀이 복습
문제 링크
먼저 user1과 user2의 공통 follower 수를 구한 다음
그 값이 최대인 조합만 뽑아오는 문제.
서브쿼리로 처리해도 되고
cte로 처리해도 상관없음.
아예 join을 할 때 user_id끼리의 대소 조건을 넣으면
굳이 least/greatest 안 써도 되겠구나 하는 생각도 든다.
WITH result
AS (SELECT r1.user_id AS "user1_id",
r2.user_id AS "user2_id",
Count(*) AS "cnt"
FROM Relations r1
JOIN Relations r2
ON r1.user_id <> r2.user_id
AND r1.follower_id = r2.follower_id
GROUP BY 1,
2)
SELECT LEAST(user1_id, user2_id) AS "user1_id",
GREATEST(user1_id, user2_id) AS "user2_id"
FROM result
WHERE cnt = (SELECT Max(cnt)
FROM result)
GROUP BY 1,
2;
SELECT e.employee_id
FROM Employees e
LEFT JOIN Salaries s
ON e.employee_id = s.employee_id
WHERE s.employee_id IS NULL
UNION
SELECT s.employee_id
FROM Salaries s
LEFT JOIN Employees e
ON s.employee_id = e.employee_id
WHERE e.employee_id IS NULL
ORDER BY 1;
SELECT w2.id
FROM Weather w1
JOIN Weather w2
ON DATEDIFF(w2.recordDate, w1.recordDate) = 1
AND w2.temperature - w1.temperature > 0;
문제 링크
Milk와 Yogurt가 동시에 포함된 장바구니 ID를 구하는 문제.
장바구니 ID로 그루핑하되,
서로 다른 품목명(NAME)이 2개 이상인 경우를 골라야 한다.
저 조건이 없으면 Milk만 들어간
서로 다른 장바구니 2개가 선택될 수도 있기 때문.
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ( 'Milk', 'Yogurt' )
GROUP BY 1
HAVING COUNT(DISTINCT NAME) >= 2
ORDER BY 1;
SELECT MAX(DATETIME) AS "시간"
FROM ANIMAL_INS;
SELECT ANIMAL_ID,
NAME,
DATE_FORMAT(DATETIME, '%Y-%m-%d')
FROM ANIMAL_INS
ORDER BY 1;
문제 링크
recursive cte를 쓰는 문제.
ANIMAL_OUTS 테이블이 어떻게 생겼는지 예시를 안 주고
쳐 봐야 알 수 있게 만든 점은 매우 별로.
WITH recursive cte
AS
(
SELECT 0 AS "HOUR"
UNION ALL
SELECT HOUR+1
FROM cte
WHERE HOUR < 23)
SELECT cte.HOUR,
COUNT(a.ANIMAL_ID) AS "COUNT"
FROM cte
LEFT JOIN ANIMAL_OUTS a
ON cte.HOUR = date_format(a.DATETIME,'%H')
GROUP BY 1;
SELECT DATE_FORMAT(DATETIME, '%H') AS "HOUR",
COUNT(ANIMAL_ID) AS "COUNT"
FROM ANIMAL_OUTS
WHERE DATE_FORMAT(DATETIME, '%H') BETWEEN 09 AND 19
GROUP BY 1
ORDER BY 1;