https://solvesql.com/problems/number-of-friends/
-- 사용자의 친구 수를 계산하는 쿼리
-- 각 사용자가 연결된 다른 사용자의 수를 합산하여 해당 사용자의 총 친구 수를 계산
WITH cte1 AS (
-- 사용자(user_id)가 다른 사용자(user_b_id)와 연결된 경우의 친구 수를 계산
SELECT
user_id, -- 사용자 ID
COUNT(user_a_id) AS cnt1 -- 해당 사용자가 연결된 다른 사용자(user_a_id)의 수
FROM users
LEFT JOIN edges
ON users.user_id = edges.user_b_id -- 'user_b_id'는 친구 관계의 대상
GROUP BY user_id -- 사용자별로 그룹화하여 친구 수 집계
),
cte2 AS (
-- 사용자(user_id)가 다른 사용자(user_a_id)와 연결된 경우의 친구 수를 계산
SELECT
user_id, -- 사용자 ID
COUNT(user_b_id) AS cnt2 -- 해당 사용자가 연결된 다른 사용자(user_b_id)의 수
FROM users
LEFT JOIN edges
ON users.user_id = edges.user_a_id -- 'user_a_id'는 친구 관계의 대상
GROUP BY user_id -- 사용자별로 그룹화하여 친구 수 집계
)
-- 최종적으로 각 사용자의 총 친구 수 계산
SELECT
cte1.user_id, -- 사용자 ID
cnt1 + cnt2 AS num_friends -- 친구 수 합산 (친구 수는 양방향 관계이므로 두 개의 카운트를 합침)
FROM cte1
LEFT JOIN cte2
ON cte1.user_id = cte2.user_id -- 두 개의 CTE를 사용자 ID를 기준으로 조인
ORDER BY
num_friends DESC, -- 친구 수가 많은 사용자부터 정렬
cte1.user_id -- 친구 수가 같은 경우 사용자 ID로 정렬
'SQL' 카테고리의 다른 글
[solvesql - day 24] 세 명이 서로 친구인 관계 찾기 (0) | 2025.01.11 |
---|---|
[solvesql - day 23] 유량(Flow)와 저량(Stock) (0) | 2025.01.11 |
[solvesql - day 21] 세션 유지 시간을 10분으로 재정의하기 (0) | 2025.01.11 |
[solvesql - day 20] 미세먼지 수치의 계절간 차이 (0) | 2025.01.11 |
[solvesql - day 19] 전국 카페 주소 데이터 정제하기 (0) | 2025.01.11 |