본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] Leet code - Investments in 2016

by kime2 2024. 7. 19.
출처

 

문제

다음과 같은 모든 보험 계약자를 위해 2016년 모든 총 투자 가치의 합계를 보고하는 솔루션을 작성하십시오.tiv_2016

한 명 이상의 다른 보험 계약자와 동일한 가치를 가지며,tiv_2015
다른 보험 계약자와 같은 도시에 있지 않습니다(즉, () 속성 쌍은 고유해야 함).lat, lon
소수점 이하 두 자리로 반올림합니다.tiv_2016

 

문제에 대한 해석

조건1. 같은 tiv_2015값을 갖고

조건2. lat, lon을 쌍으로 같은 값이 없어야 한다

풀이(MYSQL)

-- 오답
with base as ( 
    select distinct(a.pid) -- 5.조건에 필터링된 pid의 고유값 조회
    from Insurance a , Insurance b -- 1. 크로스 조인하여
    where a.pid != b.pid -- 2. 나 자신이 아니고
    and a.tiv_2015 = b.tiv_2015  -- 3. 조건 1을 만족하고
    and (a.lat, a.lon) != (b.lat, b.lon) -- 4. 1조건2를 만족하는 경우
)
select round(sum(tiv_2016),2) as 'tiv_2016'
from Insurance
where pid in (select pid from base)

 

조건 1의 결과 : 1,3,4가 출력된다

 

조건 2의 결과 : 1,3,4 동일

그러나 답은 1,4번만 해당이 되는데

pip이 3인 경우를 살펴보면

 

위도, 경도가 동일한 다른 pid가 있다

조건 2의 같은 위도, 경도의 쌍이 없어야 한다를 반영하기 위해서

같지 않다 !=를 사용하는 것이 아니라 다른 포함되지 않는 다라는 개념이 좀더 가까움(..?)

 

즉,조건2의 결과를 보면 조건1의 결과에서 위도와 경도가 같은 행만 제거되어 pid의 값에는 변화가 없는 것을 알 수 있다

 

 

-- 정답
with base as ( -- 2015년의 값이 서로 동일한 pid 1번째 조건
    select distinct(a.pid)
    from Insurance a , Insurance b
    where a.pid != b.pid
    and a.tiv_2015 = b.tiv_2015
    -- and (a.lat, a.lon) != (b.lat, b.lon)
),
base2 as ( -- 위도, 경도 쌍이 서로 다른 pid 2번째 조건
    select distinct(a.pid)
    from Insurance a , Insurance b
    where a.pid != b.pid
    and (a.lat, a.lon) = (b.lat, b.lon)
)
select round(sum(tiv_2016),2) as 'tiv_2016'
from Insurance
where pid in (select pid from base)
and pid not in (select pid from base2)

 

base를 통해 조건 1 을 충족하는 pid를 찾고

base2를 통해 조건 2를 충족하지 않는 pid를 찾아

base에는 포함되지만 base2에는 포함되지 않는 pid를 찾아야 한다