TIL - 250220

오정수·2025년 2월 20일

TIL

목록 보기
53/78

리뷰 : 코드가 꽤나 길어서 다른 사람들의 코드를 봤는데 엄청 짧다. JOIN을 두 번 할 수도 있다는 걸 알게 되었다. 그래서 나도 JOIN을 두 번 넣어서 코드를 다시 짰다. 그랬더니 훨씬 짧게 간단하게 나왔다.

리뷰 2 : EXTRACT를 사용해서 날짜만 뺄 수 있다. 날짜에 관련해서 다시 상기시킬 것은 MySQL에서는 DATE_FORMAT(), PostgreSQL에서는 TO_CHAR()에 'Mon-YYYY'식으로 조건 주기.

리뷰 3 : SUM()과 CASE WHEN을 사용하면 금방 풀 수 있는 문제이다. 여기서 제대로 봐야 할 점은 NULL값 이외에도 'n/a'도 포함시키는 것..!

리뷰 4 : YOY를 구하는 것이다. LAG()로 이전의 값을 불러오고 적절히 계산을 해서 yoy를 구할 수 있다.

URL : https://datalemur.com/questions/international-call-percentage

WITH cte AS (
  SELECT
    a.caller_id
    ,a.receiver_id
    ,a.country_id
    ,i.country_id re_country_id
  FROM(
    SELECT 
      caller_id
      ,c.receiver_id
      ,country_id
    FROM phone_calls c
    LEFT JOIN phone_info i
    USING(caller_id)
  ) a
  LEFT JOIN phone_info i
  ON a.receiver_id=i.caller_id
)
SELECT 
  ROUND(100.0 * SUM(CASE WHEN country_id!=re_country_id THEN 1 ELSE 0 END)
  / COUNT(*),1)
FROM cte
;
SELECT
  ROUND(100.0* SUM(CASE WHEN i.country_id != ii.country_id THEN 1 ELSE 0 END)
  / COUNT(*),1)
FROM phone_calls c 
LEFT JOIN phone_info i 
ON c.caller_id = i.caller_id
LEFT JOIN phone_info ii 
ON c.receiver_id = ii.caller_id
;

URL : https://datalemur.com/questions/user-retention

SELECT
  EXTRACT(MONTH FROM event_date)+1 AS month
  ,COUNT(DISTINCT user_id)
FROM user_actions
WHERE EXTRACT(MONTH FROM event_date) = 6
GROUP BY 1
;

URL : https://datalemur.com/questions/uncategorized-calls-percentage

SELECT 
  ROUND(100.0 * SUM(CASE WHEN call_category IS NULL OR call_category = 'n/a' THEN 1 ELSE 0 END) / COUNT(*),1)
FROM callers;

URL : https://datalemur.com/questions/yoy-growth-rate

SELECT
  *
  ,ROUND(100.0 * (curr_year_spend-prev_year_spend) / prev_year_spend,2)
FROM (
  SELECT
    EXTRACT(YEAR FROM transaction_date) AS year 
    ,product_id
    ,spend AS curr_year_spend
    ,LAG(spend,1) OVER (PARTITION BY product_id ORDER BY transaction_date) prev_year_spend
  FROM user_transactions
) a
;
profile
안녕하세요 오정수입니다

0개의 댓글