출처
문제
다음과 같은 모든 보험 계약자를 위해 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를 찾아야 한다
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] Leet code - Managers with at Least 5 Direct Reports (0) | 2024.07.22 |
---|---|
[문제풀이] Leet code - Employee Bonus (0) | 2024.07.19 |
[문제풀이] Leet code - Game Play Analysis IV (0) | 2024.07.17 |
[문제풀이] Leet code - Department Highest Salary (0) | 2024.07.16 |
[문제풀이] Leet code - duplicate-emails (0) | 2024.07.15 |