241209_TIL

J Lee·2024년 12월 9일
0

아무리 사소하더라도 배움이 없는 날은 없다.

SQL 문제풀이 복습


Leetcode

문제 링크
join 활용 문제.

join의 조건으로 topping_name끼리의 대소관계를 넣으면
문제에서 요구하는 알파벳 순으로 쉽게 정렬할 수 있다.
pizza의 이름을 정하는 문자열 제어는 concat만 있으면 됨.

SELECT CONCAT(t1.topping_name, ',', t2.topping_name, ',', t3.topping_name) AS
       "pizza",
       t1.cost + t2.cost + t3.cost                                         AS
       "total_cost"
FROM   Toppings t1
       JOIN Toppings t2
         ON t1.topping_name < t2.topping_name
       JOIN Toppings t3
         ON t2.topping_name < t3.topping_name
ORDER  BY 2 DESC,
          1 ASC;

문제 링크

SELECT candidate_id
FROM   Candidates
WHERE  skill IN ( 'Python', 'Tableau', 'PostgreSQL' )
GROUP  BY 1
HAVING COUNT(*) >= 3
ORDER  BY 1;

문제 링크
어렵지는 않은데 많이 헷갈리는 문제.

이 문제를 푸는 포인트는
not_prime에 해당하는 경우의 연산을 쉽게 할 수 있게
window함수(중 lead, lag도 상관없을 듯)를 써서
prime_eligible에 해당하는 수치들을 not_prime과 같은 행에 미리 위치시켜 놓는 것.

이걸 떠올리지 못하면 정말 해결하기 어렵고
그 뒤부터는 헷갈리는 계산만 주의하면 된다.

SELECT item_type,
       CASE
         WHEN item_type = 'prime_eligible' THEN cnt * Floor(500000 / sum_space)
         WHEN item_type = 'not_prime' THEN Floor(
         ( 500000 - Floor(500000 /
                    lead_space)
                    * lead_space ) / sum_space)
                                           * cnt
       END AS "item_count"
FROM   (SELECT item_type,
               Sum(square_footage)     AS "sum_space",
               Count(DISTINCT item_id) AS "cnt",
               LEAD(Sum(square_footage))
                 OVER(
                   ORDER BY item_type) AS "lead_space",
               LEAD(Count(DISTINCT item_id))
                 OVER(
                   ORDER BY item_type) AS "lead_cnt"
        FROM   Inventory
        GROUP  BY 1) result
ORDER  BY 2 DESC;
profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보