💡문제
💡문제 요약
1.hacker_id, name, 해커가 각 챌린지에서 얻은 최고점들의 합을 출력
2.해커가 얻은 총점이 0인 경우는 결과에서 제외
3-1. 점수합 desc
3-2. 동점일 경우 hacker_id asc
💡풀이 방법
풀이1.서브쿼리 활용
select m.hacker_id, h.name, sum(m.score) as total_score
from (
select hacker_id,challenge_id, max(score) as score
from submissions
group by hacker_id,challenge_id
)as m
join hackers as h on m.hacker_id = h.hacker_id
group by m.hacker_id,h.name
having total_score != 0
order by total_score desc, m.hacker_id ;
풀이2. with절 사용 (해커 랭크에서는 버전 문제로 with절 사용 시, 쿼리 실행이 안됨)
with tb as (
select s.hacker_id, name, challenge_id, max(score) as score
from submissions s
left join hackers h on h.hacker_id=s.hacker_id
group by 1,2,3
)
select hacker_id, name, sum(score) as total_score
from tb
group by 1,2
having total_score !=0
order by 3 desc, 1 asc
💡고찰
📄 저번 편에서도 with절을 쓸려다가 안되길래 계속 이유를 찾았었는데, hacker rank에서는 버전문제로 my sql with문법을 실행시킬 수 없는 문제가 발생했었다.
📄서브쿼리로 작성하려고 보니 자꾸 이런 에러가 떠서 검색해봤더니 오라클은 서브쿼리에 Alias (별칭)을 주지 않아도 정상적으로 동작하지만, MySQL 같은 경우는 무조건 에러가 난다고 한다.
Every derived table must have its own alias
📄너무너무 쉬운 코드인데 postgreSQL에 익숙해져 있어서 계속 syntax 에러가 떴고 , 하나하나 찾아보느라 오래걸렸다.. 보니깐 with절에 썼던 것 처럼 group by 1,2 나 order by 3 같은게 적용되지 않는 것 같다.
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version
for the right syntax to use near 'having total_score != 0
order by 3 desc, 1' at line 9
📄요 며칠 쿼리 짜면서 계속 with절을 썼더니 서브쿼리랑 having에 대해 가물가물해서 이 부분에 대해 복습할 수 있었다!
📄where 좌변에는 최대한 컬럼을 변형하지 않게 쓸려고 노력하는 중!
'코딩테스트 > 코딩테스트 SQL' 카테고리의 다른 글
[HackerRank] Placements (0) | 2022.09.26 |
---|---|
[HackerRank] The Blunder (0) | 2022.08.23 |
[HackerRank] Top Competitors (1) | 2022.08.22 |
댓글