https://www.hackerrank.com/challenges/weather-observation-station-17/problem
코드설명
ROUND + MIN + INNER JOIN + SUBQUERY + GROUP BY 를 활용합니다.
ORACLE 코드
정답코드1입니다.
SELECT ROUND(S1.LONG_W, 4)
FROM STATION S1
WHERE S1.LAT_N = (SELECT MIN(LAT_N) FROM STATION WHERE LAT_N > 38.7780) ;
정답코드2입니다.
SELECT ROUND(S1.LONG_W, 4)
FROM STATION S1
INNER JOIN (SELECT MIN(LAT_N) AS LAT_N FROM STATION WHERE LAT_N > 38.7780) S2
ON S1.LAT_N = S2.LAT_N;
정답코드 3입니다.
SELECT * FROM
(SELECT ROUND(LONG_W, 4)
FROM STATION
GROUP BY LONG_W, LAT_N
HAVING LAT_N > 38.7780
ORDER BY LAT_N ASC)
WHERE ROWNUM = 1;
이 방식은 정석적인 방식은 아니지만, 이렇게도 가능합니다. 정답코드3과 다른점이 무엇일까요? LAT_N을 GROUP BY 구문에서 빼면서 집계함수로 처리할 수 있게 만들었습니다.
만약 GROUP BY 에서 LAT_N을 빼면 하나의 LONG_W에 대해 여러가지의 레코드가 들어갈 수 있게 되므로 MIN을 사용하는 것 입니다. 또 아시다시피 GROUP BY 절에 없는 컬럼의 값은 집계함수를 통해서만 조회할 수 있습니다.
SELECT * FROM
(SELECT ROUND(LONG_W, 4)
FROM STATION
GROUP BY LONG_W
HAVING MIN(LAT_N) > 38.7780
ORDER BY MIN(LAT_N) ASC)
WHERE ROWNUM = 1;