본문 바로가기

코딩일기

SQL 코드카타 118 - Investments in 2016

https://leetcode.com/problems/investments-in-2016/description/

 

Column Name Type
pid int
tiv_2015 float
tiv_2016 float
lat float
lon float

 

RequestAccepted 테이블:

  • pid : 테이블의 고유 키, 보험 가입자의 ID
  • tiv_2015  : 2015년의 총 투자 가치
  • tiv_2016 : 2016년의 총 투자 가치
  • lat : 보험 가입자의 도시의 위도입니다. lat는 NULL이 아님
  • lon : 보험 가입자의 도시의 경도입니다. lon은 NULL이 아님

같은 tiv_2015 값을 가진 다른 보험 가입자가 있는 경우와 다른 모든 보험 가입자와 동일한 도시에 위치하지 않는 경우(즉, (lat, lon) 속성 쌍이 고유해야 함)에 해당하는 보험 가입자들의 2016년 총 투자 가치 tiv_2016의 합계를 보고하는 해결책을 작성하세요. tiv_2016은 소수점 둘째 자리까지 반올림하세요.

 

select
    lat,
    lon,
    count(concat(lat, lon)) AS lat_lon
from Insurance
group by concat(lat, lon)

 

도시의 유일한 위치를 반환하기 위해 위도와 경도를 결합해준다.

 

select
    lat,
    lon
from
(select
    lat,
    lon,
    count(concat(lat, lon)) AS lat_lon
from Insurance
group by concat(lat, lon)) a
where lat_lon > 1

 

결합된 위도와 경도가 유일하지 않은 경우만 골라서 출력한다. (이후에 조건문에 사용하기 위함이다.)

 

select tiv_2015
from  Insurance
group by tiv_2015
having count(tiv_2015) > 1

 

이번에는 tiv_2015가 유일한 값이 아닌 경우만 선별해서 출력한다. (이후에 조건문에 사용하기 위함이다.)

 

select *
from Insurance
where tiv_2015 in
(select tiv_2015
from  Insurance
group by tiv_2015
having count(tiv_2015) > 1)

 

해당 쿼리를 where 절의 조건으로 사용해서 tiv_2015가 유일한 값이 아닌경우(tiv_2015가 위의 쿼리에 속할 경우)만 출력한다.

 

select *
from Insurance
where tiv_2015 in
(select tiv_2015
from  Insurance
group by tiv_2015
having count(tiv_2015) > 1)
and (lat, lon) not in
(select
    lat,
    lon
from
(select
    lat,
    lon,
    count(concat(lat, lon)) AS lat_lon
from Insurance
group by concat(lat, lon)) a
where lat_lon > 1)

 

같은 방법으로 위도와 경도에 대한 쿼리를 where절의 조건으로 사용해서 lat, lon이 유일한 값인 경우(lat, lon가 위도와 경도에 대한 쿼리 에 속하지 않을 경우)를 추가적인 조건으로 사용한다.

 

select round(sum(tiv_2016), 2) tiv_2016
from Insurance
where tiv_2015 in
(select tiv_2015
from  Insurance
group by tiv_2015
having count(tiv_2015) > 1)
and (lat, lon) not in
(select
    lat,
    lon
from
(select
    lat,
    lon,
    count(concat(lat, lon)) AS lat_lon
from Insurance
group by concat(lat, lon)) a
where lat_lon > 1)

 

마지막으로 tiv_2016을 모두 더해준 뒤 반올림하면 완료!

성공!

 

아직 where구문에 다른 쿼리를 사용해서 원하는 데이터만 출력하는 부분이 부족한 것같다.