SQL 문제풀이 복습
문제 링크
문자열을 제어하는 substring_index를 활용하는 문제.
SELECT SUBSTRING_INDEX(email, '@', -1) AS "email_domain",
COUNT(*) AS "count"
FROM Emails
WHERE SUBSTRING_INDEX(email, '.', -1) LIKE 'com'
GROUP BY 1
ORDER BY 1;
substring_index 말고 substr을 사용해서
SELECT SUBSTR(email, INSTR(email, '@') + 1) AS "email_domain",
COUNT(*) AS "count"
FROM Emails
WHERE SUBSTR(email, LENGTH(email) - INSTR(REVERSE(email), '.') + 2) = 'com'
GROUP BY 1
ORDER BY 1;
이렇게 쿼리를 만들 수도 있는데,
substring_index를 쓰는 편이 더 깔끔하고 알아보기도 쉬운 듯.
문제 링크
join의 조건 안에 다 때려넣으면 되는 문제.
s1.session_end <= s2.session_end 조건을 넣는 게 약간 헷갈렸던 부분.
SELECT DISTINCT s1.user_id
FROM Sessions s1
JOIN Sessions s2
ON s1.user_id = s2.user_id
AND s1.session_id <> s2.session_id
AND s1.session_type = s2.session_type
AND s1.session_end <= s2.session_end
AND TIMESTAMPDIFF(hour, s1.session_end, s2.session_start) <= 12
ORDER BY 1;
문제 링크
이 문제는 지금 봐도 이해가 안 돼서 그냥 드랍하기로ㅠㅜ
window함수 중 max() over()를 쓰는 것까지는 이해가 됐는데
본 쿼리에서의 논리가 이해가 잘 안 된다.
WITH result
AS (SELECT *,
Max(height)
OVER(
ORDER BY id ASC) AS left_highest_bar,
Max(height)
OVER(
ORDER BY id DESC) AS right_highest_bar
FROM heights)
SELECT Sum(LEAST(left_highest_bar, right_highest_bar) - height) AS
"total_trapped_water"
FROM result;