문제
- LeetCode SQL 문제
3246. Premier League Table Ranking / Easy
- 문제 내용 : [링크]
내가 작성한 Query
SELECT TEAM_ID , TEAM_NAME , SUM(WINS*3 + DRAWS*1 + LOSSES*0) AS POINTS , RANK() OVER(ORDER BY SUM(WINS*3 + DRAWS*1 + LOSSES*0) DESC) AS POSITION FROM TEAMSTATS GROUP BY TEAM_NAME ORDER BY POINTS DESC, TEAM_NAME ASC
TEAMSTATS
테이블에서 TEAM_ID
, 문제에 조건에 따라 승리한 경우 3점, 비긴 경우 1점, 진 경우 0점을 반영한 팀별 점수 합계(POINTS
)를 구해준다.
RANK()
함수를 사용하여 위에서 구한 점수별로 등수를 구해준다.(OVER()
안에 ORDER BY
로 구현)
이 때, 동점 팀은 같은 등수를 가져야 하므로 RANK()
함수를 사용하고, 동점인 팀의 수 만큼 다음 등수에 영향을 준다.
(예를 들어, 1등 동점 팀이 두 팀인 경우, 1등/1등/3등 으로 처리)
cf) 만약 위에서 동점자 처리를 동점인 팀의 수 만큼 영향을 받지 않고 1등/1등/2등으로 처리한다면 DENSE_RANK()
함수를 사용한다.
팀별 집계 정보를 추출하므로 team_name
기준으로 GROUP BY
를 한다.
POINTS
가 동점인 경우 정렬을 team_name
기준으로 오름차순 정렬해준다.