SQL 문제풀이 복습
문제 링크
난이도는 hard지만 어렵지 않게 풀 수 있는 문제.
로 케이스를 나눠서 결과를 뽑은 다음 union하는 방식으로 해결.
중간에 join을 저렇게 많이 집어넣을 필요가 없었을 것 같기도 하다.
SELECT u.username,
activity,
startdate,
enddate
FROM Useractivity u
JOIN (SELECT username,
Count(*) AS "cnt"
FROM Useractivity
GROUP BY 1) a
ON u.username = a.username
AND a.cnt < 2
UNION ALL
SELECT username,
activity,
startdate,
enddate
FROM (SELECT u.username,
activity,
startdate,
enddate,
Rank()
OVER(
partition BY username
ORDER BY startdate DESC) AS "ranking"
FROM Useractivity u
JOIN (SELECT username,
Count(*) AS "cnt"
FROM Useractivity
GROUP BY 1) a
ON u.username = a.username
AND a.cnt >= 2) b
WHERE ranking = 2;
SELECT unique_id,
name
FROM Employees e
LEFT JOIN Employeeuni eu
ON e.id = eu.id;
문제 링크
recursive CTE와
날짜를 제어하는 함수들을 잘 활용해야 해서
꽤나 어렵게 느껴지는 문제.
딱 그것까지만 잘 할 수 있으면
본 쿼리는 크게 어렵지 않다.
WITH recursive cte
AS
(
SELECT min(period_start) AS "date"
FROM Sales
UNION ALL
SELECT date_add(date, INTERVAL 1 day)
FROM cte
WHERE date <=
(
SELECT max(period_end)
FROM Sales))
SELECT s.product_id,
p.product_name,
LEFT(date,4) AS "report_year",
sum(average_daily_sales) AS "total_amount"
FROM Sales s
JOIN Product p
ON s.product_id = p.product_id
JOIN cte
ON s.period_start <= cte.date
AND s.period_end >= cte.date
GROUP BY 1,
2,
3
ORDER BY 1,
3;