SQL 문제풀이 복습
문제 링크
1트(8/18)에서 괜히 cte를 넣었단 생각을 했다.
바로 구할 수도 있는데.
self join으로 대칭되는 경우를 구해준 다음
least와 greatest를 써서 일정한 기준으로 정렬하고
count가 2 이상인 경우를 찾으면 된다.
SELECT LEAST(c1.X, c1.Y) AS "x",
GREATEST(c1.X, c1.Y) AS "y"
FROM Coordinates c1
JOIN Coordinates c2
ON c1.X = c2.Y
AND c1.Y = c2.X
GROUP BY 1,
2
HAVING COUNT(*) >= 2
ORDER BY 1;
문제 링크
이건 cte를 써서 푸는 게 여러 모로 깔끔하겠다.
안 그러면 서브쿼리가 너무 복잡해질 것 같음..
WITH a
AS (SELECT city,
HOUR(call_time) AS "peak_calling_hour",
Count(*) AS "number_of_calls"
FROM Calls
GROUP BY 1,
2),
b
AS (SELECT city,
Max(number_of_calls) AS "max"
FROM a
GROUP BY 1)
SELECT a.city,
a.peak_calling_hour,
a.number_of_calls
FROM a
JOIN b
ON a.city = b.city
AND a.number_of_calls = b.max
ORDER BY 2 DESC,
1 DESC;
문제 링크
어렵지 않은 서브쿼리 활용 문제.
1트를 할 때가 부트캠프 끝나갈 때였구나..
SELECT ROUND(SUM(item_count * order_occurrences) / (SELECT
SUM(order_occurrences)
FROM Orders), 2) AS
"average_items_per_order"
FROM Orders;