240701_TIL

J Lee·2024년 7월 1일
0

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

SQL 코드카타

문제 링크
어렵지는 않은 Tree Node 문제.
이것도 꼬려면 미친듯이 꼬을 수 있을 것 같은데,
언제 한 번 제대로 정리를 해 놔야겠다.

SELECT DISTINCT t1.id,
                CASE
                  WHEN t1.p_id IS NULL THEN "Root"
                  WHEN t1.p_id IS NOT NULL
                       AND t2.id IS NOT NULL THEN "Inner"
                  WHEN t2.p_id IS NULL THEN "Leaf"
                end AS "type"
FROM   tree t1
       LEFT JOIN tree t2
              ON t1.id = t2.p_id
ORDER  BY 1;

문제 링크
ENUM 타입으로 들어가 있는 컬럼들의 값을 일괄적으로 변경하는 문제.

Write a solution to swap all 'f' and 'm' values
(i.e., change all 'f' values to 'm' and vice versa)
with a single update statement and no intermediate temporary tables.

Note that you must write a single update statement,
do not write any select statement for this problem.

문제에서 대놓고 select 문을 쓰지 말라고 해 놨기 때문에,
case when 등을 써서 f를 m으로, m을 f로 바꾸는 등의 방법은 통하지 않는다.
혹시나 해서 해 봤는데 역시나 오답이었다

검색 결과 UPDATE와 SET 명령어를 조합해서 쓰면 해결할 수 있다.
SET 뒤에는 흔히 알고 있는 case when 구문을 써도 무방하다.

UPDATE salary
SET sex = CASE
            WHEN sex = 'm' THEN 'f'
            WHEN sex = 'f' THEN 'm'
          END;

FROM도 없고 =가 2번 들어가는 등 익숙한 형태의 구문은 아니지만,
아무렴 데이터분석가로 일하면서 주구장창 select만 쓸 수야 있겠나.
SQLD 준비하면서 몇 번 봤던 내용이기도 하니 이 기회에 눈에 잘 익혀두기로.

문제 링크

WITH result
     AS (SELECT actor_id,
                director_id,
                Count(*) AS cnt
         FROM   actordirector
         GROUP  BY 1,
                   2)
SELECT actor_id,
       director_id
FROM   result
WHERE  cnt >= 3;

문제 링크

SELECT DISTINCT s.product_id,
                p.product_name
FROM   sales s
       INNER JOIN product p
               ON s.product_id = p.product_id
WHERE  s.sale_date BETWEEN '2019-01-01' AND '2019-03-31'
       AND s.product_id NOT IN (SELECT product_id
                                FROM   sales
                                WHERE  sale_date < '2019-01-01'
                                        OR sale_date > '2019-03-31');

문제 링크
CTE를 잘 쓰면 medium 난이도까지는 무리없이 시간 내에 풀 수 있다.
부지런히 습관 들이기.

WITH a
     AS (SELECT user_id,
                join_date
         FROM   users),
     b
     AS (SELECT buyer_id,
                Count(*) AS cnt
         FROM   orders
         WHERE  Year(order_date) = '2019'
         GROUP  BY 1)
SELECT a.user_id        AS "buyer_id",
       a.join_date,
       Ifnull(b.cnt, 0) AS "orders_in_2019"
FROM   a
       LEFT JOIN b
              ON a.user_id = b.buyer_id;

오늘은 태블로 대시보드 과제를 마무리하느라
클러스터링 복습은 생략.

profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보