ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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;

    -- 이 문제 풀는데 제일 좋은 방법인지는 의문이지만 제일 먼저 떠오름

Designed by Tistory.