SQL 문제풀이 복습
문제 링크
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;