인프런 <데이터분석을 위한 중급 SQL 문제풀이> 강의에서 나온 문제를 풀이한 과정을 정리했습니다.
SELECT DISTINCT city
FROM STATION
WHERE city NOT LIKE 'A%'
OR city NOT LIKE 'E%'
OR city NOT LIKE 'I%'
OR city NOT LIKE 'O%'
OR city NOT LIKE 'U%'
OR city NOT LIKE '%a'
OR city NOT LIKE '%e'
OR city NOT LIKE '%i'
OR city NOT LIKE '%o'
OR city NOT LIKE '%u'
: 쿼리문 자체는 문제가 없으나, 해커랭크에서 채점 통과가 안 된다.
SELECT DISTINCT city
FROM STATION
WHERE LEFT(city, 1) NOT IN ('A', 'E', 'I', 'O', 'U')
OR RIGHT(city, 1) NOT IN ('A', 'E', 'I', 'O', 'U')
LEFT(city, 1) NOT IN 'A'
이 쿼리문은 city 테이블의 문자열에서 처음 문자가 'A'가 아니라는 의미다. RIGHT는 문자열의 마지막 문자를 가리킨다.
문제를 꼼꼼히 읽자!
'either do not start with vowels or do not end with vowels'라고 했다. 'either A or B'는 A 또는 B 둘 중 어느 하나를 의미한다. 그러니 연산자는 'AND'가 아닌 'OR'를 써야한다.
NOT IN ('A', 'E', 'I', 'O', 'U')
: A, E, I, O, U를 'AND'로 연결한다고 이해했다. 이 부분은 여전히 헷갈린다. 차후 꼭 다시 풀며 제대로 이해하고 넘어가야 한다!
SELECT MAX(population) - MIN(population)
FROM CITY
SELECT TRUNCATE(SUM(LAT_N), 4)
FROM STATION
WHERE LAT_N > 38.7880
AND LAT_N < 137.2345
https://www.hackerrank.com/challenges/full-score/problem?isFullScreen=true
SELECT H.hacker_id
, H.name
FROM Submissions S
INNER JOIN Hackers H ON S.hacker_id = H.hacker_id
INNER JOIN Challenges C ON S.challenge_id = C.challenge_id
INNER JOIN Difficulty D ON C.difficulty_level = D.difficulty_level
WHERE S.score = D.score
GROUP BY H.hacker_id, H.name
HAVING COUNT(DISTINCT S.submission_id) > 1
ORDER BY COUNT(DISTINCT S.submission_id) DESC
, H.hacker_id