sql/Advent of SQL 2025
SQL 문제 풀이 챌린지(16~20)
gooreumsea
2026. 1. 14. 03:27
저작권 문제로 인해, 직접 작성한 쿼리문만 공개.
16. 초기 사용자의 친구 관계 찾기
https://solvesql.com/problems/friendship-between-early-users/
WITH r AS (
SELECT
user_a_id,
user_b_id,
user_a_id + user_b_id AS id_sum,
DENSE_RANK() OVER (ORDER BY user_a_id + user_b_id ASC) AS dr,
COUNT(*) OVER () AS total_cnt
FROM edges
),
cut AS (
SELECT MIN(dr) AS cutoff_dr
FROM (
SELECT
dr,
SUM(COUNT(*)) OVER (ORDER BY dr) AS cum_cnt,
MAX(total_cnt) AS total_cnt
FROM r
GROUP BY dr
) x
WHERE cum_cnt / total_cnt >= 0.001
)
SELECT
r.user_a_id,
r.user_b_id,
r.id_sum
FROM r
INNER JOIN cut AS c ON r.dr <= c.cutoff_dr
ORDER BY r.id_sum ASC
17. 신규 유입을 견인하는 카테고리
https://solvesql.com/problems/first-order-category/
SELECT
r.category AS category,
r.sub_category AS sub_category,
COUNT(DISTINCT r.order_id) AS cnt_orders
FROM records r
INNER JOIN customer_stats c ON r.customer_id = c.customer_id
AND r.order_date = c.first_order_date
GROUP BY
r.category,
r.sub_category
ORDER BY
cnt_orders DESC;
18. 인플루언서 마케팅 후보 찾기
https://solvesql.com/problems/influencer-marketing-candidates/
WITH all_edges AS (
SELECT user_a_id AS user_id, user_b_id AS friend_id FROM edges
UNION ALL
SELECT user_b_id AS user_id, user_a_id AS friend_id FROM edges
)
,friend_cnt AS (
SELECT
user_id,
COUNT(*) AS friends
FROM all_edges
GROUP BY user_id
)
,friends_of_friends AS (
SELECT
ae.user_id,
SUM(fc.friends) AS friends_of_friends
FROM all_edges ae
INNER JOIN friend_cnt fc ON ae.friend_id = fc.user_id
GROUP BY ae.user_id
)
SELECT
f.user_id,
f.friends,
fof.friends_of_friends,
ROUND(fof.friends_of_friends / f.friends, 2) AS ratio
FROM friend_cnt f
INNER JOIN friends_of_friends fof ON f.user_id = fof.user_id
WHERE f.friends >= 100
ORDER BY ratio DESC
LIMIT 5
19. 연도별 순매출 구하기
https://solvesql.com/problems/yearly-net-sales/
SELECT
YEAR(purchased_at) AS year,
SUM(total_price - discount_amount) AS net_sales
FROM transactions
WHERE is_returned = 0
GROUP BY YEAR(purchased_at)
ORDER BY YEAR(purchased_at)
20. 연도별 배송 업체 이용 내역 분석하기
https://solvesql.com/problems/yearly-shipping-usage/
SELECT
YEAR(purchased_at) AS year,
SUM(CASE WHEN shipping_method = 'Standard' THEN 1 ELSE 0 END) +
SUM(CASE WHEN is_returned = TRUE THEN 1 ELSE 0 END) AS standard,
SUM(CASE WHEN shipping_method = 'Express' THEN 1 ELSE 0 END) AS express,
SUM(CASE WHEN shipping_method = 'Overnight' THEN 1 ELSE 0 END) AS overnight
FROM transactions
WHERE MONTH(purchased_at) IN (11, 12)
AND YEAR(purchased_at) BETWEEN 2018 AND 2023
AND is_online_order = TRUE
GROUP BY YEAR(purchased_at)
ORDER BY year