데이터 분석

[Day 22] solvesql | Advent of SQL 2024 | 친구 수 집계하기💡 본문

SQL/solvesql

[Day 22] solvesql | Advent of SQL 2024 | 친구 수 집계하기💡

딱한아이 2024. 12. 24. 21:43
친구 수 집계하기

 

✔️0215 복습

문제 조건

1. 데이터베이스에 포함된 모든 사용자에 대해 각 사용자의 친구 수를 집계

2. 친구 수가 많은 사용자부터 출력하며, 만약 친구 수가 같은 사용자가 여럿이라면 그 사이에서는 사용자 ID가 작은 사용자가 먼저 출력

 

Solution
WITH friends_count AS (
  SELECT user_id,
         COUNT(CASE WHEN user_id = e.user_a_id THEN 1 END) +
         COUNT(CASE WHEN user_id = e.user_b_id THEN 1 END) AS num_friends
  FROM users u
  LEFT JOIN edges e
    ON u.user_id = e.user_a_id OR u.user_id = e.user_b_id
  GROUP BY user_id
)
SELECT user_id, num_friends
FROM friends_count
ORDER BY num_friends DESC, user_id ASC;

/*
WITH step1 AS (
  SELECT user_a_id AS user_id
       , COUNT(*) AS num_friends
  FROM edges
  GROUP BY user_a_id

  UNION ALL

  SELECT user_b_id 
       , COUNT(*) 
  FROM edges
  GROUP BY user_b_id

), step2 AS (
  SELECT user_id
       , SUM(num_friends) AS num_friends
  FROM step1
  GROUP BY user_id

)
SELECT u.user_id
     , CASE WHEN s.num_friends IS NOT NULL THEN s.num_friends
            ELSE 0
       END AS num_friends
FROM users u
  LEFT JOIN step2 s ON u.user_id = s.user_id
ORDER BY s.num_friends DESC, u.user_id
*/

 

✅ users 테이블까지 사용하여 친구가 없는 user_id까지 출력하도록 설계해야 한다.

✅ case 문에서 조건을 만족하지 못한 경우 NULL을 반환한다.

✅ COUNT는 NULL 값을 제외하고 계산하므로, 매칭되지 않는 경우 해당 사용자에 대한 값은 0이 된다.