241013_TIL

J Lee·2024년 10월 13일

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

SQL 문제풀이 복습

문제 링크
간단한 window함수 활용 문제.

SELECT customer_name,
       customer_id,
       order_id,
       order_date
FROM   (SELECT c.name                        AS "customer_name",
               o.customer_id,
               o.order_id,
               o.order_date,
               Rank()
                 OVER(
                   partition BY customer_id
                   ORDER BY order_date DESC) AS "row_id"
        FROM   Orders o
               JOIN Customers c
                 ON o.customer_id = c.customer_id) a
WHERE  row_id <= 3
ORDER  BY customer_name ASC,
          customer_id ASC,
          order_date DESC;

문제 링크
lower를 써서 product_name 컬럼을
모두 소문자로 변환해 준 후,
다시 trim 함수로 감싸서 앞뒤 공백을 모두 없애준다.

그냥 trim으로 쓰면 앞뒤 공백을 다 없애는 거고
왼쪽 공백만 없애고 싶으면 ltrim,
오른쪽 공백만 없애고 싶으면 rtrim 등으로 쓸 수 있다.

SELECT Trim(Lower(product_name))       AS "product_name",
       Date_format(sale_date, '%Y-%m') AS "sale_date",
       Count(*)                        AS "total"
FROM   Sales
GROUP  BY 1,
          2
ORDER  BY 1,
          2;

문제 링크
이것도 위의 것과 똑같은 window함수 기초 활용 문제.
partition by와 order by를 잘 조합하는 것이 포인트.

SELECT product_name,
       product_id,
       order_id,
       order_date
FROM   (SELECT p.product_name,
               o.product_id,
               o.order_id,
               o.order_date,
               Rank()
                 OVER(
                   partition BY product_id
                   ORDER BY order_date DESC) AS "row_id"
        FROM   Orders o
               JOIN Products p
                 ON o.product_id = p.product_id) a
WHERE  row_id = 1
ORDER  BY 1,
          2,
          3;
profile
기본기를 소홀히 하지 말자

0개의 댓글