SQL/문제풀이

[LeetCode] confirmation-rate

응엉잉 2024. 3. 4. 14:35

https://leetcode.com/problems/confirmation-rate/?envType=study-plan-v2&envId=top-sql-50

 

Confirmation Rate - LeetCode

Can you solve this real interview question? Confirmation Rate - Table: Signups +----------------+----------+ | Column Name | Type | +----------------+----------+ | user_id | int | | time_stamp | datetime | +----------------+----------+ user_id is the colum

leetcode.com

 

처음에는 JOIN을 사용하지 않고 Confirmations 테이블에 대해서만 쿼리를 작성했다.

근데 그렇게 되면 signup은 했는데 confirmation을 하지 않은 유저에 대해서 볼 수가 없더라고

그래서 Signup 테이블을 기준으로 Confirmations 테이블을 조인해주었다.

SELECT s.user_id,
    COUNT(c.user_id) AS total,
    COUNT(CASE WHEN action = 'confirmed' THEN c.user_id END) AS accepted
FROM Signups s
    LEFT JOIN Confirmations c ON s.user_id = c.user_id
GROUP BY s.user_id

c 테이블의 유저 아이디 수 = 해당 유저가 제출한 건수

action이 confirm인 경우의 c 테이블의 유저 아이디 수 = 해당 유저가 제출한 건수중 confirm된 건수

 

하지만 이 2개 조건을 냅다 나눠줄 경우 0/0 이 되는 경우가 생긴다

왜냐면 한번도 제출하지 않은 유저의 total은 0이기 때문

 

따라서 이 경우를 먼저 처리해주고

나머지 경우에 대해 2개 조건을 나눈 값을 반환하는 CASE문을 작성했다.

SELECT s.user_id,
    CASE WHEN
        COUNT(c.user_id) = 0 THEN 0
        ELSE ROUND(COUNT(CASE WHEN action = 'confirmed' THEN c.user_id END)/COUNT(c.user_id), 2)
    END AS confirmation_rate
FROM Signups s
    LEFT JOIN Confirmations c ON s.user_id = c.user_id
GROUP BY s.user_id