SQL 문제풀이 복습
문제 링크
간단한 cross join 문제.
SELECT e1.symbol AS "metal",
e2.symbol AS "nonmetal"
FROM Elements e1,
Elements e2
WHERE e1.type = 'Metal'
AND e2.type = 'Nonmetal';
문제 링크
window 함수를 여러 개 다뤄야 풀 수 있는 문제.
당장 이 한 문제를 푸는 데 들어간 함수만 해도 (안쪽부터)
이렇게 세 개나 된다.
매우 복잡한 문제이므로 다음 번에는
서브쿼리 하나씩 자세히 설명해가며 풀어보기로.
풀이법을 이해하느냐, 마냐와는 별개로
이런 발상을 떠올리지 못하면 의미가 없다.
SELECT hall_id,
Min(start_day) AS "start_day",
Max(end_day) AS "end_day"
FROM (SELECT hall_id,
start_day,
end_day,
range_start,
Sum(range_start)
OVER(
partition BY hall_id
ORDER BY start_day) AS "sum_range"
FROM (SELECT hall_id,
start_day,
end_day,
LAG(temp)
OVER(
partition BY hall_id
ORDER BY start_day) AS "range",
CASE
WHEN start_day <= LAG(temp)
OVER(
partition BY hall_id
ORDER BY start_day) THEN 0
ELSE 1
END AS "range_start"
FROM (SELECT hall_id,
start_day,
end_day,
Max(end_day)
OVER(
partition BY hall_id
ORDER BY start_day) AS "temp"
FROM HallEvents) a) b) c
GROUP BY hall_id,
sum_range;
문제 링크
문자열을 제어하는 함수를 묻는 문제.
left 함수를 써서 profession의 첫 글자를 뽑고,
그 결과물을 name과 양쪽 괄호와 함께 합치면(concat) 된다.
SELECT person_id,
CONCAT(name, '(', LEFT(profession, 1), ')') AS "name"
FROM Person
ORDER BY 1 DESC;