- lat, lon 조합이 유일해야 한다.
- 각각 lat, lon을 count로 2개 이상인지 체크
- window function으로 (lat, lon)을 파티셔닝하고 count로 체크
- tiv_2015 값이 중복돼야 한다.
WITH cte as (
SELECT tiv_2016,
COUNT(*) OVER(PARTITION BY tiv_2015) as tiv_2015_cnt,
COUNT(*) OVER(PARTITION BY lat, lon) as loc_cnt
FROM Insurance
)
SELECT ROUND(SUM(tiv_2016), 2) as tiv_2016
FROM cte
WHERE loc_cnt = 1 AND
tiv_2015_cnt <> 1
파티셔닝하고 정렬을 다시 해야 하기 때문에 window function은 아무래도 좀 느리다.
lat, lon 조합을 사용하고 싶으면 CONCAT을 사용하는 방법도 존재한다.
WHERE CONCAT(lat, lon) in (
SELECT concat(lat, lon) as loc
FROM Insurance
GROUP BY
CONCAT(lat, lon)
HAVING COUNT(pid) = 1
)
위도, 경도를 합쳐버려서 문자열로 만드는 방법은 다른 여러 문제에서 사용할 수 있는 좋은 테크닉일 것 같다.