안녕하세요.
머리가 너무 멍멍해져서 조언 구합니다.
일자 / 구매자 / 과일
20240101 A 사과
20240102 A 사과
20240102 A 딸기
20240103 A 귤
20240104 A 감
일자별로 최근 3일간 3번이상 구매한 자를 찾는 쿼리를 만들고 있습니다.
예를들면 위 데이터를 기준으로 쿼리를 돌리면 아래와 같이 결과가 나오는 것입니다.
20240102 A 3건
20240103 A 4건
20240104 A 3건
하루만 기준으로 돌리는건 쉬운데 여러날짜를 동시에 확인하는걸 만들려고 해보니 안되네요
프로시저말곤 답이 없을까요? ㅜㅜ 조언 부탁드립니다.
----------------------------------------
제 방법으로 만들긴했는데 댓글에 파일첨부가 안되서 본문에 올려요
결과는 맞는 것 같은데 가독성도 떨어지고 너무 별로같네요.. 평가 부탁드려요
WITH t AS ( SELECT '20240101' dt, 'A' id, '사과' fruit FROM dual UNION ALL SELECT '20240102', 'A', '사과' FROM dual UNION ALL SELECT '20240102', 'A', '딸기' FROM dual UNION ALL SELECT '20240103', 'A', '귤' FROM dual UNION ALL SELECT '20240104', 'A', '감' FROM dual ) -- 분석함수 -- SELECT * FROM (SELECT id, dt , SUM(COUNT(*)) OVER(PARTITION BY id ORDER BY TO_DATE(dt, 'yyyymmdd') RANGE INTERVAL '2' DAY PRECEDING) cnt FROM t GROUP BY id, dt ) WHERE cnt >= 3 ;
작성하신 쿼리는 서브쿼리를 이용해 카운트 체크하므로 메인에서 서브쿼리의 카운트를 출력못하게 되어, 카운트 출력을 위해 다시 또 조인하는 형태가 되었네요. 서브쿼리 형태가 아닌 조인 그룹바이 형태로 가져가면 훨씬 더 간결해 집니다.
WITH std_data AS ( SELECT '20240101' dd, 'A' cs, '사과' pdt FROM dual UNION ALL SELECT '20240102', 'A', '귤' FROM dual UNION ALL SELECT '20240102', 'A', '딸기' FROM dual UNION ALL SELECT '20240105', 'A', '사과' FROM dual UNION ALL SELECT '20240105', 'A', '복숭아' FROM dual UNION ALL SELECT '20240106', 'A', '토마토' FROM dual UNION ALL SELECT '20240106', 'A', '수박' FROM dual ) -- Self Join -- SELECT a.dd , a.cs , COUNT(*) cnt FROM (SELECT DISTINCT cs, dd FROM std_data) a , std_data b WHERE b.cs = a.cs AND b.dd >= TO_CHAR(TO_DATE(a.dd, 'yyyymmdd') - 2, 'yyyymmdd') AND b.dd <= a.dd GROUP BY a.cs, a.dd HAVING COUNT(*) >= 3 ORDER BY a.cs, a.dd ;