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
- 프로그래머스
- 데이터분석
- leetcode
- 딥러닝
- eda
- Labor Management System
- HackerRank
- Inventory Optimization
- Product Demand
- forecast
- pandas profiling
- SKU Consolidation
- kaggle
- 파이썬
- 당신의 인생이 왜 힘들지 않아야 한다고 생각하십니까
- 코딩테스트연습
- TensorFlowGPU
- ProfileReport
- tensorflow
- 웨어하우스 보관 최적화
- SQL
- oracle
- ABC Analysis
- 신경쓰기의 기술
- ModelCheckPoint
- 피그마인디언
- MySQL
- 코딩테스트
- MS SQL Server
- Gaimification
Archives
- Today
- Total
오늘도 배운다
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
'코딩테스트연습(SQL)' 카테고리의 다른 글
1341. Movie Rating / LeetCode, SQL, MS SQL Server (0) | 2023.04.19 |
---|---|
1907. Count Salary Categories / LeetCode, SQL, MS SQL Server (0) | 2023.04.18 |
1321. Restaurant Growth / LeetCode, SQL, MS SQL Server (0) | 2023.04.16 |
1204. Last Person to Fit in the Bus / LeetCode, SQL, MS SQL Server (0) | 2023.04.15 |
550. Game Play Analysis IV / LeetCode, SQL, MS SQL Server (0) | 2023.04.14 |
Comments