241110_TIL

J Lee·2024년 11월 10일
0

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

SQL 문제풀이 복습


Leetcode

문제 링크
window 함수를 써서 원하는 형태로 정렬하는 문제.

SELECT first_col,
       second_col
FROM   (SELECT ROW_NUMBER()
                 OVER(
                   ORDER BY first_col ASC) AS "row_id",
               first_col
        FROM   Data) a
       LEFT JOIN (SELECT ROW_NUMBER()
                           OVER(
                             ORDER BY second_col DESC) AS "row_id",
                         second_col
                  FROM   Data) b
              ON a.row_id = b.row_id;

문제 링크
연승 중 최다 기록을 뽑는 문제.
이 문제의 포인트는 group by를 할 때
row_1 - row_2를 인자로 집어넣는 것.
이걸 해 줘야 한 팀의 연승 횟수를 알 수 있다.
그 외의 나머지는 그렇게 어렵지 않음.

SELECT DISTINCT m.player_id,
                IFNULL(longest_streak, 0) AS "longest_streak"
FROM   Matches m
       LEFT JOIN (SELECT player_id,
                         Max(streak) AS "longest_streak"
                  FROM   (SELECT player_id,
                                 Count(row_1 - row_2) AS "streak"
                          FROM   (SELECT player_id,
                                         match_day,
                                         result,
                                         ROW_NUMBER()
                                           OVER(
                                             PARTITION BY player_id
                                             ORDER BY match_day ASC) AS "row_1",
                                         ROW_NUMBER()
                                           OVER(
                                             PARTITION BY player_id, result
                                             ORDER BY match_day ASC) AS "row_2"
                                  FROM   Matches) a
                          WHERE  result = 'win'
                          GROUP  BY 1,
                                    row_1 - row_2) b
                  GROUP  BY 1) c
              ON m.player_id = c.player_id;

문제 링크
이 문제를 풀 때 알아야 할 건
의외로 window 함수가 아니라 cast다.

저걸 안 쓰면 ranking끼리 뺄 수가 없기 때문...인데,
cast ~ as signed로 컬럼을 감싸주면
숫자처럼 연산이 가능해진다.

SELECT t.team_id,
       t.NAME,
       Cast(RANK()
              OVER(
                ORDER BY points DESC, NAME ASC) AS SIGNED) - Cast(RANK()
       OVER(
         ORDER BY t.points+p.points_change DESC, NAME ASC) AS SIGNED) AS
       "rank_diff"
FROM   TeamPoints t
       LEFT JOIN PointsChange p
              ON t.team_id = p.team_id;
profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보