Kimuksung
Kimuksung 안녕하세요. 분산처리에 관심이 많은 생각하는 주니어 Data Enginner입니다.

leet code sql 585

leet code sql 585

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

문제


  • tiv_2015 값이 최소 한개 이상 같아야 한다.
  • 같은 위치(위도, 경도)에 존재하는 사람은 없어야 한다.
  • 소수점 2자리까지 나타내어야한다.

문제 접근


  • 위 조건을 만족하는 pid의 tiv_2016 총액 = group by
  • 소수점 2자리까지 = decimal
  • 각 조건에 대한 요청 사항을 subquery 혹은 join절로 구할 수 있다.
  • 위 경우에는 group이 필요하기에 join 보다 subquery가 더 적절
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# subquery
with tiv_2015_data as (
    select 
        tiv_2015
    from Insurance
    group by tiv_2015
    having count(*) > 1
),
location as (
    select 
        lat,
        lon
    from Insurance
    group by lat,lon
    having count(*) = 1
)
select
    round(sum(tiv_2016), 2) tiv_2016
from Insurance a
join tiv_2015_data b
    on a.tiv_2015 = b.tiv_2015
join location c
    on a.lat = c.lat
        and a.lon = c.lon

# join
SELECT ROUND(SUM(tiv_2016), 2) AS tiv_2016
FROM Insurance
WHERE tiv_2015 IN (
    SELECT tiv_2015
    FROM Insurance
    GROUP BY tiv_2015
    HAVING COUNT(*) > 1
)
AND (lat, lon) IN (
    SELECT lat, lon
    FROM Insurance
    GROUP BY lat, lon
    HAVING COUNT(*) = 1
)
having count(tiv_2015)>1