262. 여행과 사용자 / LeetCode, SQL, MySQL

문제

출처: 리트코드

취소율은 당일 금지되지 않은 사용자의 취소된 요청 수(클라이언트 또는 드라이버별)를 금지되지 않은 사용자의 총 요청 수로 나누어 계산합니다.

매일 “2013-10-01″과 “2013-10-03” 사이에 잠금 해제된 사용자(클라이언트와 드라이버가 모두 잠기지 않아야 함)가 있는 요청의 취소 비율을 찾는 SQL 쿼리를 작성하십시오. 취소율은 소수점 둘째 자리에서 반올림하십시오.
임의의 순서로 결과 테이블을 반환합니다.


262. 여행과 사용자 / LeetCode, SQL, MySQL 1

제출(MySQL)

WITH users_ubnd AS (
    SELECT users_id
    FROM users
    WHERE banned = 'No' 
),

oct_1_thru_3 AS (
    SELECT 
        request_at, 
        CASE WHEN status REGEXP'^cancelled' THEN 1
        ELSE 0 END AS cancellation
    FROM 
        trips
    WHERE 
        client_id IN (SELECT users_id FROM users_ubnd)
        AND
        driver_id IN (SELECT users_id FROM users_ubnd)
        AND
        request_at BETWEEN '2013-10-01' AND '2013-10-03'
)

SELECT 
    request_at AS Day,
    ROUND(
        AVG(cancellation), 2
        ) AS 'Cancellation Rate'
FROM oct_1_thru_3
GROUP BY request_at

솔루션(MySQL)

더보기

전략

>> CTE에서 다음 데이터 수집

A. 잠금 해제된 사용자 ID 목록

나. 2013년 10월 1일부터 2013년 10월 3일까지 운행 금지되지 않은 고객 및 운전자의 운행 데이터

– b점은 ID와 취소 여부를 이진화하여 확률을 쉽게 계산할 수 있습니다.
(취소는 1, 취소는 0)

WITH users_ubnd AS (
    SELECT users_id
    FROM users
    WHERE banned = 'No' 
),

oct_1_thru_3 AS (
    SELECT 
        request_at, 
        CASE WHEN status REGEXP'^cancelled' THEN 1
        ELSE 0 END AS cancellation
    FROM 
        trips
    WHERE 
        client_id IN (SELECT users_id FROM users_ubnd)
        AND
        driver_id IN (SELECT users_id FROM users_ubnd)
        AND
        request_at BETWEEN '2013-10-01' AND '2013-10-03'
)

oct_1_thru_3 날짜별로 그룹핑 후 평균 취소 여부 계산

SELECT 
    request_at AS Day,
    ROUND(
        AVG(cancellation), 2
        ) AS 'Cancellation Rate'
FROM oct_1_thru_3
GROUP BY request_at

문제로 이동(MySQL)