첫구매 구하는 쿼리 0 1 1,735

by 나나나나 [MySQL] [2017.03.14 06:11:53]


안녕하세요

index user_id amount date   user_id user_name
1001 1 50000 2016-11-12 1 홍길동
2001 2 30000 2016-12-13 2 김나나
3001 2 20000 2017-01-13 3 송하나
4001 1 40000 2017-02-13 4 미니언즈
5001 3 40000 2017-03-16    
6001 4 30000 2017-04-16    
7001 3 20000 2017-05-17    

2017-01-01~2017-03-31 사이 첫 구매자 구하는 쿼리가 궁금합니다.
제가 원하는 결과값은 이렇게

5001 송하나 40000 2017-03-16

5번만 나오는건데  min으로 구현시 다른값도 섞여나와서 날짜조건을 걸 때 잘못건게 아닌가 싶어서 문의드립니다.

 

감사합니다.

 

by jkson [2017.03.14 08:04:16]
with  t1
as (
select '1001' idx,'1' user_id,'50000' amount,to_date('2016-11-12','yyyy-mm-dd') as dt from dual union all
select '2001','2','30000',to_date('2016-12-13','yyyy-mm-dd') from dual union all
select '3001','2','20000',to_date('2017-01-13','yyyy-mm-dd') from dual union all
select '4001','1','40000',to_date('2017-02-13','yyyy-mm-dd') from dual union all
select '5001','3','40000',to_date('2017-03-16','yyyy-mm-dd') from dual union all
select '6001','4','30000',to_date('2017-04-16','yyyy-mm-dd') from dual union all
select '7001','3','20000',to_date('2017-05-17','yyyy-mm-dd') from dual 
)
,t2
as (
select '1' user_id,'홍길동' user_name from dual union all
select '2','김나나' from dual union all
select '3','송하나' from dual union all
select '4','미니언즈' from dual
)
select a.idx, b.user_name, a.amount, a.dt from
(
select idx, user_id, amount, dt, row_number() over(partition by user_id order by dt, idx) rn 
from t1) a
,t2 b
where a.user_id = b.user_id  
and dt between to_date('2017-01-01','yyyy-mm-dd') and to_date('2017-03-31','yyyy-mm-dd')
and rn = 1

위의 방법으로 하면 테이블이 작으면 괜찮을 것 같은데 테이블 사이즈가 아주 크면

전체 기간에 대해 user_id별로 순번을 구해야해서 비효율이 있겠네요.

select idx, user_name, amount, dt
  from
    (
    select a.idx, b.user_name, a.amount, a.dt, row_number() over(partition by a.user_id order by dt, idx) rn 
      from t1 a, t2 b
     where a.user_id = b.user_id
       and dt between to_date('2017-01-01','yyyy-mm-dd') and to_date('2017-03-31','yyyy-mm-dd')
       and not exists (select 1 
                         from t1 b 
                        where b.user_id = a.user_id
                          and dt < to_date('2017-01-01','yyyy-mm-dd'))
    ) 
 where rn = 1

이렇게 하면 좀 나을 것 같습니다.

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