-
SQL 코딩테스트 풀이SQL 공부 2024. 1. 12. 23:11
1. 프로그래머스
(2024.01.12)
1) Recursive CTE 활용
WITH RECURSIVE HOUR_TABLE AS
(SELECT 0 AS HOUR
UNION ALL
SELECT HOUR+1 AS HOUR
FROM HOUR_TABLE
WHERE HOUR < 23)
SELECT HT.HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM HOUR_TABLE HT
LEFT JOIN ANIMAL_OUTS AO
ON HT.HOUR = HOUR(AO.DATETIME)
GROUP BY 1
ORDER BY 1;-- 사용자 정의 변수 사용하는 방법보다 더 직관적이고 쉽다고 생각
2) 몫 함수 DIV
SELECT (PRICE DIV 10000)* 10000 AS PRICE_GROUP
, COUNT(DISTINCT PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY 1
ORDER BY 1;-- 어려운 함수는 아니나 // 가 익숙해서 DIV 기억이 맨날 안나기 때문에 정리
3) Partition By 활용
SELECT YEAR(SALES_DATE) AS YEAR
, MONTH(SALES_DATE) AS MONTH
, COUNT(DISTINCT OS.USER_ID) AS PURCHASED_USERS
, ROUND(COUNT(DISTINCT OS.USER_ID) / TOTAL_JOINED, 1) AS PURCHASED_RATIO
FROM (SELECT *
, COUNT(USER_ID) OVER (PARTITION BY YEAR(JOINED)) AS TOTAL_JOINED
FROM USER_INFO
WHERE YEAR(JOINED) = 2021
) UI
LEFT JOIN ONLINE_SALE OS
ON UI.USER_ID = OS.USER_ID
GROUP BY 1, 2
HAVING COUNT(DISTINCT OS.USER_ID) > 0
ORDER BY 1, 2;-- 이 문제 풀는데 제일 좋은 방법인지는 의문이지만 제일 먼저 떠오름