안녕하세요
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으로 구현시 다른값도 섞여나와서 날짜조건을 걸 때 잘못건게 아닌가 싶어서 문의드립니다.
감사합니다.
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
이렇게 하면 좀 나을 것 같습니다.