https://www.hackerrank.com/challenges/weather-observation-station-15/problem?isFullScreen=true
코드설명
ROUND + SUBQUERY + INNER JOIN + GROUP BY 를 활용합니다.
쿼리는 정말 여러가지 방식으로 작성할 수 있습니다.
아래와 같이 근본적으로는 같으나, 3가지 방식으로 풀어서 작성해보았습니다.
이 문제에서 GROUP BY 를 사용할 수도 있습니다.
ORACLE 코드
정답코드1입니다.
SELECT ROUND(LONG_W, 4)
FROM STATION
WHERE LAT_N = (SELECT MAX(LAT_N) FROM STATION WHERE LAT_N < 137.2345);
UNNEST하여 INNER JOIN으로 풀어서 쓴 코드입니다.
SELECT ROUND(S.LONG_W, 4)
FROM STATION S
INNER JOIN (SELECT MAX(LAT_N) AS LAT_N FROM STATION WHERE LAT_N < 137.2345) S2
ON S.LAT_N = S2.LAT_N;
ROWNUM을 활용한 코드입니다.
SELECT * FROM
( SELECT ROUND(LONG_W, 4)
FROM STATION S
WHERE S.LAT_N < 137.2345
ORDER BY S.LAT_N DESC)
WHERE ROWNUM = 1;
GROUP BY를 활용한 코드입니다.
여기서 특이점은 MAX(LAT_N)입니다.
사실상 LONG_W가 같은 데이터에 대하여 GROUP BY 함으로써 여러 데이터들을 집계하는데, GROUP BY 절이 있는 쿼리에서는 SELECT 또는 ORDER BY 절에 나오는 모든 컬럼은 반드시 GROUP BY 절에 포함되거나 집계 함수에 의해 처리되어야 합니다. 그러므로 MAX(LAT_N)으로, LONG_W의 값 중 가장 최대값중 가져옵니다.
이유는 LAT_N은 여러가지가 있기에 집계함수를 사용하여야 DBMS가 어떤 데이터를 가져와야할지 선택할 수 있겠지요.
SELECT * FROM (
SELECT ROUND(LONG_W, 4)
FROM STATION
WHERE LAT_N < 137.2345
GROUP BY LONG_W
ORDER BY MAX(LAT_N) DESC)
WHERE ROWNUM = 1;