코딩 테스트 연습

SQL (RANK(), 상위 1%) - 사용자의 송금기록으로 상위 1% 찾기

baektree 2025. 12. 17. 14:57

문제 설명

transactions 테이블에는 사용자 간 송금 기록이 있다.

transactions

sender_id 송금한 사용자 ID
receiver_id 받은 사용자 ID
amount 송금 금액
created_at 송금 일시

각 송금 건에 대해 sender_id + receiver_id 값을 계산하라.

👉 이 값이 상위 1% 이내에 해당하는 송금 관계만 조회하라.

출력 컬럼

  • sender_id
  • receiver_id
  • id_sum

조건

  • 상위는 값이 클수록 상위
  • 동점은 모두 포함

코드

SELECT sender_id
        ,receiver_id
        ,id_sum
FROM (
    SELECT sender_id
            ,receiver_id
            ,sender_id + receiver_id AS id_sum
            ,RANK() OVER(ORDER BY sender_id + receiver_id DESC) AS rnk
    FROM transactions 
    ) ranking
WHERE rnk <= ( SELECT COUNT(*) FROM transactions ) * 0.01

풀이

  1. 아이디 합 내림차순 기준 랭킹 부여
    • 이때 동점은 모두 포함하라는 조건이 있으므로 값 기준 랭킹을 매기는 RANK () 를 사용
  2. 상위 1% 이내인 랭킹만 조회
    • total * ratio 이내인 랭킹만 조회해야 하므로 퍼센트 컷을 rnk <= ( SELECT COUNT(*) FROM transactions ) * 0.01 로 설정