Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- 프로그래머스
- pandas
- regexp
- LEFTJOIN
- 퍼널분석
- 독서
- 윈도우 함수
- 누적합
- funnel
- 취준
- row_number
- 린분석
- 리텐션
- 순위함수
- 서브쿼리
- MYSQL
- python
- SQL
- 데이터분석
- Retention
- SolveSQL
- 윈도우함수
- advent of sql
- leetcode
- dense_rank
- 신입 데이터분석가
- 그로스해킹
- 데이터리안
- Datarian
- rank
Archives
- Today
- Total
데이터 분석
[Day 24] solvesql | Advent of SQL 2024 | 이상 사용자 탐지💡 본문
세 명이 서로 친구인 관계 찾기
✔️0215 복습
소셜 네트워크 분석에서는 세 명의 사용자가 서로 친구 관계인 경우를 중요하게 생각한다.
일반적인 사용자는 세 명의 사용자가 서로 친구인 경우가 다수 있지만, 스팸 사용자 또는 친구 관계를 무작위로 맺는 사용자의 경우 전체 친구 수에 비해 세 명의 사용자가 친구인 경우가 많지 않아 이상 사용자 탐지에 유용하게 쓸 수 있기 때문이다.
문제 조건
1. ID가 3820인 사용자를 포함해 세 명의 사용자가 친구 관계인 경우를 출력
2. 중복된 세 친구 관계를 제외하기 위해 user_a_id < user_b_id < user_c_id를 만족하도록 출력

Solution
WITH T1 AS (
SELECT e.user_a_id,
e.user_b_id,
e2.user_c_id
FROM edges e
JOIN (SELECT user_a_id as user_b_id,
user_b_id as user_c_id
FROM edges) e2 ON e.user_b_id = e2.user_b_id
WHERE 3820 IN (user_a_id, e.user_b_id, user_c_id)
)
SELECT t.user_a_id,
t.user_b_id,
t.user_c_id
FROM edges e
JOIN T1 t ON e.user_a_id = t.user_a_id AND e.user_b_id = t.user_c_id
/*
WITH step1 AS (
SELECT e1.user_a_id
, e1.user_b_id
, e2.user_b_id AS user_c_id -- ✔️join 방식 의도를 살펴보며는 (a,b)/(b,c)간에는 친구 관계임
FROM edges e1
JOIN edges e2 ON e1.user_b_id = e2.user_a_id
WHERE 3820 IN (e1.user_a_id, e1.user_b_id, e2.user_b_id)
)
SELECT s.*
FROM step1 s
JOIN edges e ON s.user_a_id = e.user_a_id
AND s.user_c_id = e.user_b_id
*/
/*
WITH step1 AS (
SELECT e1.user_a_id
, e1.user_b_id
, e2.user_b_id AS user_c_id -- ✔️join 방식 의도를 살펴보며는 (a,b)/(b,c)간에는 친구 관계임
FROM edges e1
JOIN edges e2 ON e1.user_b_id = e2.user_a_id
WHERE 3820 IN (e1.user_a_id, e1.user_b_id, e2.user_b_id)
)
SELECT *
FROM step1
WHERE (user_a_id, user_c_id) IN (
SELECT *
FROM edges
)
*/
▶ T1 CTE:
user_a_id와 user_b_id가 친구, user_b_id와 user_c_id가 친구인 관계인 경우를 출력한다.

▶ 최종 SELECT:
user_a_id와 user_c_id가 친구 관계에 속하여 3명 모두 친구 관계인 경우를 출력한다.

CTE와 비교해보면,
(3442, 3820) -> 친구 X
(3446, 3875) -> 친구 X
(3442, 3913) -> 친구 X
(3442, 3918) -> 친구 X
임을 알 수 있다.
✔️0215 복습
'SQL > solvesql' 카테고리의 다른 글
| solvesql | 레스토랑의 요일별 VIP (1) | 2025.01.24 |
|---|---|
| solvesql | 다음날도 서울숲의 미세먼지 농도는 나쁨 😵💫 (2) | 2025.01.24 |
| [Day 23] solvesql | Advent of SQL 2024 | 유량 지표와 저량 지표 (2) | 2024.12.25 |
| [Day 22] solvesql | Advent of SQL 2024 | 친구 수 집계하기💡 (0) | 2024.12.24 |
| [Day 21] solvesql | Advent of SQL 2024 | 세션 유지 시간을 10분으로 재정의하기⭐💡 (0) | 2024.12.24 |