241212_TIL

J Lee·2024년 12월 12일
0

아무리 사소하더라도 배움이 없는 날은 없다.

SQL 문제풀이 복습


Leetcode

문제 링크
문자열을 제어하는 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;
profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보