585. Investments in 2016(LeetCode)

minllny·2024년 4월 2일


저번에 풀다가 어려워서 방치해두었던.. 시간이 지나고야 코테에게 다시 돌아왔다..
뭔가 유레카싶은 게 떠올라서 제출했는데 틀렸다 ..ㅠ
피곤하기도 하고 문제가 어려우니 일단 오늘은 틀린 답을 남겨두고 가겠습니다..

WITH T1 AS (
    SELECT tiv_2015
         , COUNT(tiv_2015) cnt
    FROM Insurance
    GROUP BY tiv_2015
), T2 AS (
    SELECT CONCAT(lat, ",", lon) loc
         , COUNT(CONCAT(lat, ",", lon)) cnt
    FROM Insurance
    GROUP BY loc
)

SELECT SUM(tiv_2016) tiv_2016
FROM Insurance
WHERE tiv_2015 IN (SELECT tiv_2015
                   FROM T1
                   WHERE cnt >= 2)
  AND (lat, lon) IN (SELECT CAST(SUBSTRING_INDEX(loc, ',', 1) AS DECIMAL)
                         , CAST(SUBSTRING_INDEX(loc, ',', 2) AS DECIMAL)
                    FROM T2
                    WHERE cnt = 1
 )

LeetCode 중급 왜이리 어렵나요 🫥
그래도 다시 돌아온 나 칭찬해 👏👏


네.. 다음 날 돌아와서 살짝 만져보는데 맞았어요.. ㅋㅋㅋ
WITH T1 AS (
   SELECT tiv_2015
        , COUNT(tiv_2015) cnt
   FROM Insurance
   GROUP BY tiv_2015
), T2 AS (
   SELECT CONCAT(lat, ",", lon) loc
        , COUNT(CONCAT(lat, ",", lon)) cnt
        , lat
        , lon
   FROM Insurance
   GROUP BY loc
)

SELECT ROUND(SUM(tiv_2016), 2) tiv_2016		--반올림 추가
FROM Insurance
WHERE tiv_2015 IN (SELECT tiv_2015
                  FROM T1
                  WHERE cnt >= 2)
 AND (lat, lon) IN (SELECT lat			--바꾼 부분
                         , lon			--바꾼 부분
                   FROM T2
                   WHERE cnt = 1
)

처음 코드에서 문자열을 decimal 타입으로 바꿔줘서 괜찮을 줄 알았는데 아니었네요.. ㅎㅎ

제 쿼리가 너무 복잡한 것 같아서 다른 사람의 쿼리를 가져와봤습니다.
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
)

전체적인 형태는 비슷한 것 같은데 이 분의 쿼리가 훨씬 간결하네요.
그룹화후 COUNT(*)를 해주면 그룹별로 카운트를 해준다는 것을 알았습니다!!

SELECT절에서만 COUNT()를 할 수 있다고 생각했어서 코드가 엄청 길어졌던 것 같습니다 ㅎ

profile
SQL 끄적끄적

0개의 댓글