TIL - 250212

오정수·2025년 2월 11일

TIL

목록 보기
47/78

어제 오류들은 datalemur의 문제인 걸로 보인다. 모든 문제가 그런 게 아니라 특정 문제만 그래서 오류가 없는 문제들만 풀어봤다.

리뷰 1 : 난이도가 역대급으로 어려웠다. &를 활용하면 짝수 홀수를 구분할 수 있다. &는 비트 연산으로 숫자 & 1의 의미는 이진법 첫번째 자리의 수를 의미한다. 숫자 & 1 = 0은 짝수이고 숫자 & 1 = 1은 홀수이다. & 2에 대해 궁금해서 물어봤는데 이해를 못하겠다.

리뷰 2 : 쉽게 보았다가 마지막 order_id를 변환할 수 없는 것에 통탄했다. CASE WHEN에서 AND를 사용해서 최종 id를 구해 추가적으로 변환을 했다.

리뷰 3 : datalemur가 포스트그레SQL을 많이 활용해서 헷갈렸다. 특히 MySQL에서 사용하는 날짜 변환은 DATE_FORMAT()을 활용한다. 3번 문제의 경우 %b로 해야 3글자로 변환해준다. %M => June, %b => Jun과 같다. PostgreSQL에서는 TO_CHAR()를 사용하고 'Mon-YYYY'와 같은 형식으로 조건을 주어야 한다. 어렵군..

URL : https://datalemur.com/questions/odd-even-measurements

SELECT
  CAST(measurement_time AS DATE) measurement_day
  ,ROUND(SUM(CASE WHEN num & 1 = 1 THEN measurement_value ELSE 0 END),2) odd_sum
  ,ROUND(SUM(CASE WHEN num & 1 = 0 THEN measurement_value ELSE 0 END),2) even_sum
FROM (
  SELECT
    *
    ,ROW_NUMBER() OVER(PARTITION BY measurement_date ORDER BY 1) num
  FROM (
    SELECT 
      *
      ,EXTRACT(DAY FROM measurement_time) measurement_date
    FROM measurements
    ORDER BY measurement_time
  ) a
) b
GROUP BY measurement_day
ORDER BY measurement_day
;

URL : https://datalemur.com/questions/sql-swapped-food-delivery

WITH cte as (SELECT count(order_id) tot FROM orders)

SELECT
  CASE 
    WHEN order_id & 1 = 1 AND order_id!=tot THEN order_id+1
    WHEN order_id & 1 = 1 AND order_id=tot THEN order_id
    ELSE order_id-1
    END corrected_order_id
    ,item
FROM orders,cte
ORDER BY corrected_order_id
;

URL : https://datalemur.com/questions/sql-bloomberg-stock-min-max-1

SELECT
  a.ticker
  ,TO_CHAR(b.date,'Mon-YYYY') highest_mth
  ,highest_open
  ,TO_CHAR(c.date,'Mon-YYYY') lowest_mth
  ,lowest_open
FROM (
  SELECT
    ticker
    ,MAX(open) highest_open
    ,MIN(open) lowest_open
  FROM stock_prices
  GROUP BY ticker
) a
INNER JOIN stock_prices b 
ON a.ticker = b.ticker AND a.highest_open = b.open
INNER JOIN stock_prices c 
ON a.ticker = c.ticker AND a.lowest_open = c.open
ORDER BY 1
;
profile
안녕하세요 오정수입니다

0개의 댓글