홍동이의 성장일기
[LeetCode] 1934. Confirmation Rate (특정 조건에 부합하는 확률 구하기) 본문
🔎 문제
사용자의 확인율은 '확인'된 메시지 수를 전체 확인 요청 메시지 수로 나눈 값입니다. 확인 메시지를 요청하지 않은 사용자의 확인율은 0입니다. 확인율을 소수점 두 자리로 반올림합니다. 솔루션을 작성하여 각 사용자의 확인률을 찾습니다.
📍 문제 링크: https://leetcode.com/problems/confirmation-rate/description/
💡 문제 풀이
# 풀이 1번
WITH cte_all AS
(
SELECT s.user_id, c.action
, CASE WHEN action = 'confirmed' THEN 1
ELSE 0
END as 'cou'
FROM signups as s left join confirmations as c
on s.user_id = c.user_id
)
SELECT user_id
, ROUND(SUM(cou) / COUNT(*), 2) as 'confirmation_rate'
FROM cte_all
GROUP BY 1
1️⃣ user_id = 6의 경우 signups 테이블에는 데이터가 있지만 confirmations에는 없다.
따라서 LEFT JOIN을 사용해서 두 테이블을 조인해주었다.
SELECT *
FROM signups as s left join confirmations as c
on s.user_id = c.user_id
2️⃣ 여러가지 코딩테스트를 풀어보면서 보통 이렇게 특정 조건이 있는 경우는 CASE문을 사용해서 해결하는 경우를 많이 보았다. 그래서 이번에도 action이 confirmed인 경우는 1 그렇지 않은 경우는 0을 지정해주었다.
SELECT s.user_id, c.action
, CASE WHEN action = 'confirmed' THEN 1
ELSE 0
END as 'cou'
FROM signups as s left join confirmations as c
on s.user_id = c.user_id
3️⃣ user_id를 기준으로 group by를 해주고, 전체 행을 count한 것에서 cou를 나눠주면 confirmation_rate를 구할 수 있다.
문제를 풀고 solutions를 살펴보니 단 두 줄로 이 문제를 풀 수 있었다는 것을 알 수 있었다🫢
조건이 confirmed인지, 아닌지 단 두가지이므로 case문 대신 IF를 사용할 수 있었고, 임의의 테이블을 하나 더 만들지 않아도 해결이 가능했다. 해당 쿼리를 바탕으로 내 쿼리를 조금 더 간단하게 수정해보았다.
# Solution 방법 1번에 적용하기 (CASE 대신 IF를 사용함, cte를 만들 필요가 없었음!)
SELECT s.user_id
, ROUND(SUM(IF(c.action='confirmed',1,0))/COUNT(*), 2) as 'confirmation_rate'
FROM signups as s left join confirmations as c
on s.user_id = c.user_id
GROUP BY s.user_id
위 풀이에서는 avg함수를 사용하여 더욱 간단하게 문제를 해결했다.
다음에 비슷한 문제가 나오면 같은 방법으로 풀어봐야겠다.
'Tool > SQL 코딩테스트 풀이' 카테고리의 다른 글
[Advent of SQL 2024🎄] SQLite 특수문자 포함하지 않도록 하는 구문 (0) | 2024.12.16 |
---|---|
[LeetCode] 601. Human Traffic of Stadium (연속된 id 가져오기) (0) | 2024.04.04 |
[LeetCode] 1907. Count Salary Categories (범위에 값이 없으면 0을 반환) (1) | 2024.01.07 |
[LeetCode] 1341. Movie Rating (Union vs. Union All) (2) | 2024.01.03 |
[LeetCode] 1204. Last Person to Fit in the Bus (누적합계 구하기) (1) | 2023.12.30 |