일별로 최근 3일동안의 구매건수 확인하는 방법 0 6 4,166

by 열공합시다 [SQL Query] 쿼리 튜닝 [2024.03.08 10:20:36]


20240308_135821.jpg (2,832,571Bytes)

안녕하세요.

머리가 너무 멍멍해져서 조언 구합니다.

일자 / 구매자 / 과일

20240101 A 사과

20240102 A 사과

20240102 A 딸기

20240103 A 귤

20240104 A 감

 

일자별로 최근 3일간 3번이상 구매한 자를 찾는 쿼리를 만들고 있습니다. 

예를들면 위 데이터를 기준으로 쿼리를 돌리면 아래와 같이 결과가 나오는 것입니다.

20240102 A 3건

20240103 A 4건

20240104 A 3건

 

하루만 기준으로 돌리는건 쉬운데 여러날짜를 동시에 확인하는걸 만들려고 해보니 안되네요

프로시저말곤 답이 없을까요? ㅜㅜ 조언 부탁드립니다.

----------------------------------------

제 방법으로 만들긴했는데 댓글에 파일첨부가 안되서 본문에 올려요

결과는 맞는 것 같은데 가독성도 떨어지고 너무 별로같네요.. 평가 부탁드려요

by 열공합시다 [2024.03.08 10:40:38]

어엇 먼가 지금 연관서브쿼리를 이용하면 될 것 같아서 시도중입니다!


by 마농 [2024.03.08 10:43:30]

DBMS 는 뭔가요? (Oracle vs MSSQL vs MySQL vs ?)
일자컬럼의 자료형은 뭔가요? (VARCHAR vs DATE)


by 열공합시다 [2024.03.08 10:52:47]

오라클이고 varchar입니다


by 마농 [2024.03.08 11:27:12]
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
;

 


by 열공합시다 [2024.03.08 14:09:48]

마농님이 도와주신게 훨씬 깔끔하네요..

제가 만들긴했는데 영 별로네요..ㅋㅋ

 


by 마농 [2024.03.11 08:52:09]
작성하신 쿼리는 서브쿼리를 이용해 카운트 체크하므로
메인에서 서브쿼리의 카운트를 출력못하게 되어, 카운트 출력을 위해 다시 또 조인하는 형태가 되었네요.
서브쿼리 형태가 아닌 조인 그룹바이 형태로 가져가면 훨씬 더 간결해 집니다.
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
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입