관리 메뉴

오늘도 배운다

1934. Confirmation Rate / LeetCode, SQL, MS SQL Server 본문

코딩테스트연습(SQL)

1934. Confirmation Rate / LeetCode, SQL, MS SQL Server

LearnerToRunner 2023. 4. 17. 20:08

문제

source: LeetCode
The confirmation rate of a user is the number of 'confirmed' messages divided by the total number of requested confirmation messages. The confirmation rate of a user that did not request any confirmation messages is 0. Round the confirmation rate to two decimal places.

Write an SQL query to find the confirmation rate of each user.

Return the result table in any order.

 

 

 

 

제출답안(MS SQL Server)

WITH
    ls_signups
        AS (SELECT 
                DISTINCT(user_id)
            FROM 
                signups),

    log_cfrm
        AS (SELECT 
                user_id,
                CASE WHEN action = 'confirmed' THEN 1 ELSE 0 END AS is_confirmed
            FROM 
                confirmations),
    cnt_cfrm
        AS (SELECT
                user_id, 
                SUM(is_confirmed) AS cnt_cfrm,
                COUNT(user_id) AS cnt_rqst
            FROM 
                log_cfrm
            GROUP BY
                user_id)

SELECT 
    rqst.user_id, 
    ISNULL(ROUND(cnt_cfrm*1.0/cnt_rqst , 2), 0.00) AS confirmation_rate
FROM 
    ls_signups AS rqst
    LEFT JOIN cnt_cfrm AS cfrm ON rqst.user_id = cfrm.user_id

 

 

 

풀이(MS SQL Server)

더보기

CTE1: Sign_up을 시도한 user_id의 목록

WITH
    ls_signups
        AS (SELECT 
                DISTINCT(user_id)
            FROM 
                signups),

>> 예시에 user_id 6을  보면 signup 테이블에 id가 있어도 confirmation에 없는 경우가 있다.

>> 따라서, 리스트를 별도로 만들고 confirmation table 값을 LEFT JOIN한다

 

CTE2: confirmation 테이블의 action column을 원핫 인코딩

    log_cfrm
        AS (SELECT 
                user_id,
                CASE WHEN action = 'confirmed' THEN 1 ELSE 0 END AS is_confirmed
            FROM 
                confirmations),

>> CASE WHEN 구절을 사용하여 confirmed일 경우 1, 아닐경우 0을 부여

 

CTE3: ID별 confirmation 수와 요청 횟수

    cnt_cfrm
        AS (SELECT
                user_id, 
                SUM(is_confirmed) AS cnt_cfrm,
                COUNT(user_id) AS cnt_rqst
            FROM 
                log_cfrm
            GROUP BY
                user_id)

 

 

Signup 테이블의 id (CTE1)에 CTE3 LEFT JOIN

SELECT 
    rqst.user_id, 
    ISNULL(ROUND(cnt_cfrm*1.0/cnt_rqst , 2), 0.00) AS confirmation_rate
FROM 
    ls_signups AS rqst
    LEFT JOIN cnt_cfrm AS cfrm ON rqst.user_id = cfrm.user_id

>> ISNULL을 이용하여 JOIN 결과가 null인 경우 0.0을 자동 입력

>> cnt_cfrm과 cnt_rqst의 데이터 타입은 INT이므로 나눈 결과는 몫만 나옴

>> 따라서 1.0을 곱해줌으로써 FLOAT로 캐스팅 후 나누기 연산을 수행

 

 

문제 바로가기(MS SQL Server)

728x90
Comments