문제 설명
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
풀이
- 아이디 합 내림차순 기준 랭킹 부여
- 이때 동점은 모두 포함하라는 조건이 있으므로 값 기준 랭킹을 매기는 RANK () 를 사용
- 상위 1% 이내인 랭킹만 조회
- total * ratio 이내인 랭킹만 조회해야 하므로 퍼센트 컷을 rnk <= ( SELECT COUNT(*) FROM transactions ) * 0.01 로 설정
'코딩 테스트 연습' 카테고리의 다른 글
| SQL (계층쿼리, INNER JOIN) - New Companies (0) | 2025.12.31 |
|---|---|
| SQL (CONCAT, ORDER BY) - The PADS (0) | 2025.12.29 |
| SQL (재귀 쿼리, LEFT JOIN, LAG, COALESCE ) - 이틀치 누적 출고량 시뮬레이션 (0) | 2025.12.22 |
| SQL (PIVOT) - 제품 카테고리 별 매출 추이 (0) | 2025.12.12 |
| SQL (LAG(), MAX(), TIMESTAMPDIFF, DENSE_RANK()) - 스터디 카페의 '집중 타임' 세션 정의하기 (0) | 2025.12.11 |