[QCC] 4회차

양승우·2024년 12월 13일

코드카타

목록 보기
37/58

문제

최근 특정 사용자들이 결제를 하지 않고 상품을 주문하거나,
결제를 하지 않은 시점에 이미 상품을 주문하는 버그가 발견되었습니다. 🐞
해당 버그를 악용한 사용자를 파악하기 위해 SQL 문을 작성해주세요.

주요 개념

처음에는 WITH문을 3개 사용하여 코드를 작성했는데,
WHERE절을 잘 사용하면 with문 1개에 메인쿼리로 끝낼 수 있었다.
버그 유저의 조건은 (1) 결제 없이 주문만 넣은 유저, (2) 최초 결제보다 먼저 주문을 넣은 유저로 2가지 케이스가 있는데,
이 둘은 각각 (1) LEFT JOIN을 했을 때 user_id is null인 경우와 (2) order_date < min(payment_date)로 표현할 수 있다
이 둘을 WHERE절에서 OR로 묶어주면 해결된다!

코드

WITH find_first_pay AS (
  -- user_id마다 처음으로 주문한 날짜를 구한다
	SELECT 
		USER_ID 
		, min(CAST(date_format(pay_date, '%Y-%m-%d') AS date)) AS "min_pay_date"
	FROM
		payments
	GROUP BY
		USER_ID 
)
SELECT 
-- 	fp.user_id
-- 	, o.user_id
-- 	, o.order_date
-- 	, fp.min_pay_date
	count(DISTINCT o.user_id) AS "cnt"
FROM
	orders o
	LEFT JOIN find_first_pay fp
		ON fp.user_id = o.user_id
WHERE 
	1=1	
	AND ((fp.user_id IS NULL)
		OR (o.order_date < fp.min_pay_date))
;
profile
어제보다 오늘 더

0개의 댓글