https://app.codility.com/programmers/trainings/6/
Codility SQL exerercise 3번문제 풀이
<문제 출처>
SqlWorldCup
<source code>
select *
from (
select teams.team_id, teams.team_name, coalesce(C.num_points,0) as num_points
from teams
left join (
select B.team_id, sum(B.num_points) as num_points
from (
select A.host_team as team_id,
case
when A.host_goals > A.guest_goals then 3
when A.host_goals < A.guest_goals then 0
when A.host_goals = A.guest_goals then 1
end as num_points
from (
select *
from matches
union all
select match_id, guest_team as host_team, host_team as guest_team, guest_goals as host_goals, host_goals as gueset_goals
from matches
) as A
) as B
group by B.team_id
) C
on teams.team_id = C.team_id
) D
order by D.num_points desc, D.team_id
해당 문제 풀이시, 주요 함수는 coalesce 이다. coalesce(변수, 0) 을 사용해, NULL인 값을 0으로 변경해주어야 한다.
풀이의 진행순서는 아래와 같다.
1/ host team과 guest_team은 상대적이므로, 각자 자기 입장에서의 승점(num_points) 계산이 필요하다. 따라서, match row를 각자 host_team이라고 가정하고 이어붙여 총 10개의 행을 만든다. <union all 사용>
2/ host_team 이 이긴 경우 3점, 진 경우 0 점, 비긴 경우 1점을 부여한다. <case when 사용>
3/ 각 팀별 승점(num_points) 의 총합을 도출한다. <group by ~ sum 사용>
4/ 기존 teams 테이블에 해당 연산한 테이블(C) 를 team_id를 기준으로 join 해준다 <left join ~ on 사용>
5/ left join 을 했을 경우, key 의 value가 없는 경우 null값이 되므로, 결측치인 경우 0으로 치환해준다. <coalesce 사용>
6/ 문제의 요구 사항에 맞게 승점 및 team명을 기준으로 정렬해준다. <order by 사용>
해당 문제를 더 효율적으로 풀이할 수 있는 방법이 분명 있을 것이라고 생각한다.
이 부분에 대해서는 조금 더 공부하여 다양한 풀이 전략을 익히도록 해야겠다.
728x90
'Language(R, Python, SQL) > SQL' 카테고리의 다른 글
[SQL] MysQL 데이터베이스 권한 부여 (0) | 2022.12.19 |
---|---|
[SQL] HackerRank - SQL Problem <easy> (0) | 2022.12.08 |
[SQL] String 을 Date 형으로 변환 (0) | 2022.12.01 |
[SQL] Codility SQL exercise 2번 문제 (0) | 2022.11.28 |