241006_TIL

J Lee·2024년 10월 6일

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

SQL 문제풀이 복습

문제 링크
난이도는 hard지만 어렵지 않게 풀 수 있는 문제.

  1. 전체 활동의 수가 1개밖에 없는 경우
  2. 전체 활동의 수가 2개 이상인 경우

로 케이스를 나눠서 결과를 뽑은 다음 union하는 방식으로 해결.
중간에 join을 저렇게 많이 집어넣을 필요가 없었을 것 같기도 하다.

SELECT u.username,
       activity,
       startdate,
       enddate
FROM   Useractivity u
       JOIN (SELECT username,
                    Count(*) AS "cnt"
             FROM   Useractivity
             GROUP  BY 1) a
         ON u.username = a.username
            AND a.cnt < 2
UNION ALL
SELECT username,
       activity,
       startdate,
       enddate
FROM   (SELECT u.username,
               activity,
               startdate,
               enddate,
               Rank()
                 OVER(
                   partition BY username
                   ORDER BY startdate DESC) AS "ranking"
        FROM   Useractivity u
               JOIN (SELECT username,
                            Count(*) AS "cnt"
                     FROM   Useractivity
                     GROUP  BY 1) a
                 ON u.username = a.username
                    AND a.cnt >= 2) b
WHERE  ranking = 2;

문제 링크

SELECT unique_id,
       name
FROM   Employees e
       LEFT JOIN Employeeuni eu
              ON e.id = eu.id;

문제 링크
recursive CTE와
날짜를 제어하는 함수들을 잘 활용해야 해서
꽤나 어렵게 느껴지는 문제.
딱 그것까지만 잘 할 수 있으면
본 쿼리는 크게 어렵지 않다.

WITH recursive cte
AS
  (
         SELECT min(period_start) AS "date"
         FROM   Sales
         UNION ALL
         SELECT date_add(date, INTERVAL 1 day)
         FROM   cte
         WHERE  date <=
                (
                       SELECT max(period_end)
                       FROM   Sales))
  SELECT   s.product_id,
           p.product_name,
           LEFT(date,4)             AS "report_year",
           sum(average_daily_sales) AS "total_amount"
  FROM     Sales s
  JOIN     Product p
  ON       s.product_id = p.product_id
  JOIN     cte
  ON       s.period_start <= cte.date
  AND      s.period_end >= cte.date
  GROUP BY 1,
           2,
           3
  ORDER BY 1,
           3;
profile
기본기를 소홀히 하지 말자

0개의 댓글