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;
오늘은 태블로 대시보드 과제를 마무리하느라
클러스터링 복습은 생략.