241123_TIL

J Lee·2024년 11월 23일
0

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

SQL 문제풀이 복습


Leetcode

문제 링크
간단한 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 함수를 여러 개 다뤄야 풀 수 있는 문제.
당장 이 한 문제를 푸는 데 들어간 함수만 해도 (안쪽부터)

  • max over
  • lag over
  • sum over

이렇게 세 개나 된다.
매우 복잡한 문제이므로 다음 번에는
서브쿼리 하나씩 자세히 설명해가며 풀어보기로.

풀이법을 이해하느냐, 마냐와는 별개로
이런 발상을 떠올리지 못하면 의미가 없다.

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;
profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보