코테 준비 | Friend Requests II: Who Has the Most Friends / Investments in 2016 (union all / 중복값만 or 중복값이 아닌 행만 필터링 하기)

2025. 1. 10. 14:56·SQL

☑️  602. Friend Requests II: Who Has the Most Friends

[문제]

  • Write a solution to find the people who have the most friends and the most friends number.
  • The test cases are generated so that only one person has the most friends.
  • 가장 많은 친구를 가진 사람과 그 수 조회하기

[문제 풀이]

내 코드

WITH total AS (
    SELECT requester_id as id
      ,count(distinct accepter_id) as n
    FROM REQUESTACCEPTED
    GROUP BY requester_id
    UNION ALL -- UNION 만 쓰면 연결 될때 중복값 자동 제거 됨. 연결될때 손실없이 연결하려면 UNION ALL
    SELECT accepter_id as id
        ,count(distinct requester_id) as n
    FROM REQUESTACCEPTED
    GROUP BY accepter_id
)
SELECT id
        ,sum(n) as num
FROM total
GROUP BY id
ORDER BY sum(n) DESC
LIMIT 1

 

수정 코드 

WITH AllIds AS (
    SELECT requester_id AS id FROM RequestAccepted
    UNION ALL
    SELECT accepter_id FROM RequestAccepted
  )
SELECT id,
 	 COUNT(*) AS num
FROM AllIds
GROUP BY 1
ORDER BY 2 DESC
LIMIT 1;

 

이슈 및 해결 과정

  • 행 병합 시 union vs union all 
    • 각 서브쿼리의 컬럼타입/ 컬럼 갯수 가 동일해서 union 으로 연결해줬는데, union 사용시 중복값 자동 제거 됨
    • union all로 중복값 출력하여 해결 
  • 수정 코드
    • 나의 경우, 그룹바이 후 union all 해줬는데, 문제풀이를 보니 union 으로 병합 먼저 해주고, 필터링 해줄수 있었음. 
    •  휠씬 짧아 진듯 , 성능은 유사 

☑️  585. Investments in 2016

[문제]

  • Write a solution to report the sum of all total investment values in 2016 tiv_2016, for all policyholders who:
    • have the same tiv_2015 value as one or more other policyholders, and
    • are not located in the same city as any other policyholder (i.e., the (lat, lon) attribute pairs must be unique).
    • Round tiv_2016 to two decimal places.
  • 2016년 토탈 보험료 조회 하기 
    • 2015년 값이 한명이상의 다른 policyholders와 같고 
    • 같은 지역(lat,lon 페어가 중복이 아닌) 이 아닌 조건

[문제 풀이]

내 코드

SELECT ROUND(SUM(tiv_2016),2) AS tiv_2016
FROM (select *
            ,count(pid) over (partition by concat(lat,lon)) as cnts_p
            ,count(tiv_2015) over (partition by tiv_2015) as cnts_t 
       from insurance) AS total
WHERE cnts_p=1
  AND cnts_t>1

 

이슈 및 해결 과정  

  • `문제풀이 핵심` : 특정 컬럼의 행이 중복 일때 & 중복이 아닐 때 각각 필터링 하기 
    • (실패) 아이디어1 : `dense_rank` 순번매기기로 접근하기 → tiv_2015이 중복값일때 같은 순번 매겨지지만, 몇 번째에 중복값이 있는지 필터링 해줄 수 없음 → 다른 아이디어로 접근
    • (실패) 아이디어2 : where 절 서브쿼리로 접근 →  where 절 서브쿼리로 tiv_2015 가 중복값일때만 필터링 하고, 아우터 쿼리에서 lat&lon 값이 중복이 아닌것만 필터링 하려고 했는데, 서브쿼리로 이미 필터링 된 후라 lat&lon 중복인게 필터링이 안됨  → 다른 아이디어로 접근
  • (해결) count 윈도우 함수 & from 절 서브쿼리로 접근
    • 인라인 서브쿼리에 count 윈도우 함수 집계하여 tiv_2015컬럼의 중복값 , concat(lat,lon) 의 중복값 집계하는 컬럼 추가 
    • 아우터 쿼리에서 집계값이 중복값일때 ( >1), 중복값이 아닐때(>1) 필터링 해줘서 해결 

한줄 포인트

  • union 병합시 , 중복 값 필요한 경우 `union all` 사용
  • 중복행 or 중복행이 아닌행 필터링 시 count 윈도우 함수로 접근

'SQL' 카테고리의 다른 글

코테준비 | Patients With a Condition (문자열 추출 - 정규표현식 REGEXP , 특정문자기준 슬라이싱 - SUBSTRING_INDEX)  (0) 2025.01.14
QCC | 3회차 코드 리뷰 & 피드백  (0) 2025.01.10
코테 준비 | Restaurant Growth(이동 평균, 누적 합 구하기 - 윈도우함수/연관 서브쿼리/ N 행 이후부터 끝까지 출력하기)  (0) 2025.01.09
코테 준비 | Movie Rating (JOIN,UNION ALL)  (0) 2025.01.09
코테 준비 | Exchange Seats ( 홀수 짝수 자리바꾸기 - LAG,LEAD)  (0) 2025.01.07
'SQL' 카테고리의 다른 글
  • 코테준비 | Patients With a Condition (문자열 추출 - 정규표현식 REGEXP , 특정문자기준 슬라이싱 - SUBSTRING_INDEX)
  • QCC | 3회차 코드 리뷰 & 피드백
  • 코테 준비 | Restaurant Growth(이동 평균, 누적 합 구하기 - 윈도우함수/연관 서브쿼리/ N 행 이후부터 끝까지 출력하기)
  • 코테 준비 | Movie Rating (JOIN,UNION ALL)
성장하는 쿠키의 로그 기록
성장하는 쿠키의 로그 기록
성장하는 쿠키의 모든 로그를 담습니다.
  • 성장하는 쿠키의 로그 기록
    쿠키 로그
    성장하는 쿠키의 로그 기록
  • 전체
    오늘
    어제
    • 분류 전체보기 (143)
      • TODAY I LEARNED (2)
      • 데이터 분석 (13)
      • SQL (49)
      • PYTHON (39)
      • 통계,검정,머신러닝 (22)
      • TABLEAU (5)
      • 내배캠 | 데이터분석 부트캠프 (12)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Wil
    MySQL
    머신러닝
    코테준비
    태블로
    데이터분석
    티스토리챌린지
    pandas
    Python
    해커랭크
    파이썬
    SQL
    오블완
    프로그래머스
    데이터분석가
    데이터분석프로젝트
    내배캠
    코딩테스트준비
    sql코딩테스트
    데이터리안
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
성장하는 쿠키의 로그 기록
코테 준비 | Friend Requests II: Who Has the Most Friends / Investments in 2016 (union all / 중복값만 or 중복값이 아닌 행만 필터링 하기)
상단으로

티스토리툴바