패스트캠퍼스의 SQL강의를 다 듣고 난 후, 'HackerRank'라는 사이트에서 SQL 문제들을 풀기 시작했다.
HackerRank는 코딩을 시작한 사람들은 누구나 아는 유명한 사이트로 SQL, Python, Java, C언어 등 다양한 종류의 언어들을 학습할 수 있는 사이트다.
나는 HackerLank에서 SQL 문제들을 풀고 있다.
배웠던 문법들을 실제 어떻게 사용할지 배울 수 있는 좋은 문제들이다.
난이도가 Easy~Hard까지 있는데 이번에 난이도 Medium의 어려운 문제가 있었다.
한참을 헤매다가 해설 찾아보면서 문제를 풀었는데, 잊지 않도록 기록으로 남기려 한다.
문제
HackerRank - SQL - Weather Observation Station 20
해결
1. 중간 열 확인을 위해 Rownumber 열 추가
SET @ ROWINDEX = -1 ;
SET 변수 입력 후 ;를 눌러 코드를 끝내야 한다.
SELECT @ROWINDEX := @ROWINDEX +1 AS ROWNUMBER, LAT_N FROM STATION
@ROWINDEX는 행마다 +1씩 더해져 값이 출력된다.
즉, -1부터 시작했기에, 첫번째 행 0, 두 번째 행 1, 세 번째 행 2, 네 번째 행 3.....
2. Rownumber 이용하여 중간 열 확인
WHERE ROWNUMBER IN (FLOOR(@ROWINDEX/2), CEIL(@ROWINDEX/2))
(1) ROWNUMBER 값 중 IN에 있는 숫자와 일치하는 값만 필터됨
(2) 여기서 @ROWINDEX는 행의 가장 마지막 값이 출력된다.
즉, 100행이 있으면 @ROWINDEX에서는 99가 출력된다. (0부터 시작했기에)
(3) FLOOR : 소수점 버림 / CEIL : 소수점 무조건 올림
@ROWINDEX가 99(홀수) 일 경우, @ROWINDEX/2는 49.5이고, 49행과 50행 두 개가 조회됨
@ROWINDEX가 100(짝수) 일 경우, @ROWINDEX/2는 50이고, 50행만 조회됨.
3. 확인한 중간 열의 LAT_N 값을 확인
SELECT ROUND( AVG (LAT_N), 4)
(1) ROUND : 소수점 4자리까지 출력하기 위해
(2) AVG : @ROWINDEX가 99(홀수) 일 경우, 2개 행의 평균값을 구해야 하기에
4. 각 단계의 코드를 합친 최종 코드
Oracle에는 Median 함수가 있어서 바로 구할 수 있다고 한다.
나는 MySQL을 기준으로 풀고 있어서 복잡하게 풀어야만 했다.
행 개수를 구하는 것도 Oracle에는 Rank, Row_number가 있어서 함수 하나만 쓰면 바로 나오는데, MySQL에서는 SET을 이용해 복잡하게 구해야 했다.
(MySQL에서 이제는 Rank가 사용 가능해졌다고 들었으나, HackerRank에서는 이 부분이 반영이 안 되었는지 MySQL 선택 시 함수 사용이 불가능하다.)
그러나 복잡한 코드를 공부하면서 새로운 함수도 배우고, 문제 푸는 방식도 배웠으니 좋게 생각해야겠다.
이 문제를 풀기 위해 찾아봤던 '문제풀이 글' 링크도 첨부한다.
상세하게 설명되어 있어서 코드 하나하나 쫓아가며 따라 하기 쉬웠다.
글로만 보면 어려울 수 있으니, 실제로 코드를 작성하며 읽기를 추천한다.
techblog-history-younghunjo1.tistory.com/160
'코딩공부' 카테고리의 다른 글
[SQL] SQLD 자격증 준비 시작 (2) | 2021.05.03 |
---|---|
[HackerRank] 문제풀이 - MySQL JOIN (0) | 2021.04.17 |
[패스트캠퍼스] 'SQL/DB 올인원 패키지' 내 돈 후기 (0) | 2021.04.08 |
'도리를 찾아서' 수령 후기 (0) | 2016.07.27 |
도리를 찾아서 원서 이벤트 (0) | 2016.07.07 |