database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 7154 게시물 읽기
No. 7154
새해 복 많이 받으세요~ 쿼리 질문 하나 드립니다~
작성자
이성원(wolfre)
작성일
2019-01-03 11:15
조회수
2,261

안녕하세요~ 새해 복 많이들 받으세요 !! 새해부터 질문 하나 드립니다.

 

로우데이터 샘플은 아래와 같이 간단하게 유저고유번호, 날짜만 있고요.. 

UserID DATE
1000 2019-01-01
1000 2019-01-02
1000 2019-01-03
1000 2019-01-04
1002 2018-12-03
1002 2018-12-20
1003 2018-12-01
1003 2018-12-11

 

고민하는 결과는 아래와 같습니다.

유저별로 재구매 주기를 알 고 싶습니다.

ex) 1000번 유저가 첫 구매 후 2번째 구매까지 걸린 일차가 1일차라면 아래 테이블에서 카운트 + 1 

 

일차(재구매) 2번째 구매 3번째 구매 4번째 구매
1일차      
2일차      
3일차      
4일차      
5일차      

 

항상 감사합니다 !

 

 

 

이 글에 대한 댓글이 총 4건 있습니다.
with t as (
	select '1000' UserID, convert(datetime, '2019-01-01') dt
	union all
	select '1000' UserID, convert(datetime, '2019-01-02') dt
	union all
	select '1000' UserID, convert(datetime, '2019-01-03') dt
	union all
	select '1000' UserID, convert(datetime, '2019-01-04') dt
	union all
	select '1002' UserID, convert(datetime, '2018-12-03') dt
	union all
	select '1002' UserID, convert(datetime, '2018-12-20') dt
	union all
	select '1003' UserID, convert(datetime, '2018-12-01') dt
	union all
	select '1003' UserID, convert(datetime, '2018-12-11') dt
)
select UserID, Cnt, datediff(day, PreDt, dt) df
from (
	select t.*
		,lag(dt, 1, null) over(partition by UserID order by dt) PreDt
		,ROW_NUMBER() over(partition by UserID order by dt) Cnt
	from t
) lst
where Cnt > 1
;
 

 

 lag 함수를 이용하면 될 것으로 보입니다.

위 쿼리 결과로 각 고객별 몇번째 구매인지(Cnt)와 재구매 까지 날 수(df)를 알 수 있습니다.

 

 

박인호(paerae)님이 2019-01-03 14:20에 작성한 댓글입니다.

 박인호님 소중한 답변 정말 감사합니다 ! :) 

 

정말 최고입니다!!!

이성원(wolfre)님이 2019-01-03 14:26에 작성한 댓글입니다.
이 댓글은 2019-01-03 14:32에 마지막으로 수정되었습니다.

3번째 구매의 재구매 일수 구하는 기준일자가
첫번째 일자인지? 두번째 일자인지? 에 따라서
MIN 을 사용할지 LAG 를 사용할지 정하시면 됩니다.

WITH t AS
(
SELECT 1000 UserID, '2019-01-01' dt
UNION ALL SELECT 1000, '2019-01-02'
UNION ALL SELECT 1000, '2019-01-03'
UNION ALL SELECT 1000, '2019-01-04'
UNION ALL SELECT 1002, '2018-12-03'
UNION ALL SELECT 1002, '2018-12-20'
UNION ALL SELECT 1003, '2018-12-01'
UNION ALL SELECT 1003, '2018-12-11'
)
SELECT *
  FROM (SELECT UserID
             , ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY dt) rn
             , DATEDIFF(d, MIN(dt) OVER(PARTITION BY UserID), dt) df
          FROM t
        ) a
 PIVOT (COUNT(UserID)  FOR rn IN ("2", "3", "4")) a
 WHERE df != 0
;

마농(manon94)님이 2019-01-03 16:36에 작성한 댓글입니다.
이 댓글은 2019-01-03 17:13에 마지막으로 수정되었습니다.

 마농님도 답변 감사합니다. 복 많이 받으세요~

이성원(wolfre)님이 2019-01-09 11:48에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
7157mssql invalid object는 어떻게 check하나요?
톰보우
2019-02-22
1861
7156테이블 반환 함수 동적쿼리 방법 문의 드립니다.
임민규
2019-01-10
2038
7155PK INDEX 관련 질문 드립니다. [2]
거북이
2019-01-09
1995
7154새해 복 많이 받으세요~ 쿼리 질문 하나 드립니다~ [4]
이성원
2019-01-03
2261
7153선입선출 구현 [3]
tiger
2018-11-21
3021
7152. 관련 용어 [1]
권기혁
2018-11-20
2287
7151쿼리 문의드립니다. [3]
kris
2018-11-11
2157
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.052초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다