위도, 경도의 단위가 degree이므로 radian으로 변환
RADIANS(lat), RADIANS(lng)
updated_at가 자신보다 최근인 정류소 5개 이상
LEFT JOIN으로 self join을 한 후에, 조건절에 s_near.updated_at > s.updated_at로 필터링
두 정류소 간의 거리가 300m 이내인 정류소를 찾아야 하는데, 다른 사람들의 풀이를 보니 수학적으로 동일한 다른 공식을 찾아서 푼 것을 확인했다. 좋은 풀이지만, 나는 그냥 문제에 주어진 풀이식 그대로 활용해서 풀려고 한다. 코딩테스트를 본다고 했을 때, 수식 변환을 그 자리에서 하지 못할 것이라는 확신이 있기 때문에..그냥 한다.
-- 01. 두 장소의 거리가 300m 이내인 정류소
-- 02. updated_at가 자신보다 최근인 정류소가 5개 이상
WITH cte as (
SELECT s.name, s.station_id, COUNT(s_near.station_id) as cnt
FROM station s LEFT JOIN station s_near
ON s_near.updated_at > s.updated_at
AND 2 * 6356 * ASIN(
SQRT(
POW(SIN(RADIANS(s.lat - s_near.lat) / 2), 2) +
COS(RADIANS(s.lat)) * COS(RADIANS(s_near.lat)) * POW(SIN(RADIANS(s.lng - s_near.lng) / 2), 2)
)
) < 0.3
GROUP BY
s.station_id)
SELECT name, station_id
FROM cte
WHERE cnt >= 5