Problem
There is a customer purchase table that contains many transactions as show below. We want to only select the most recent 10 transactions for each customer. How do we do it?
SQL> select * from V_ALL_TXNS where rownum <20; CUSTOMER_ID TXN_DT TXN_AMT -------------------- --------- ---------- 11738368607 02-DEC-10 4.59 11738368607 06-DEC-10 115 11738368607 06-DEC-10 12.04 11738368607 06-DEC-10 8.7 11738368607 06-DEC-10 15.96 11738368607 07-DEC-10 7 11738368607 07-DEC-10 8 11738368607 07-DEC-10 50 11738368607 13-DEC-10 2.12 11738368607 23-DEC-10 14.95 11738368607 28-DEC-10 209.8 11738368607 28-DEC-10 18.41 11738368607 30-DEC-10 43.18 11738368607 29-DEC-10 49.98 11738368607 29-DEC-10 9.83 11738368607 28-DEC-10 11.65 11738368607 30-DEC-10 20 11738368607 06-DEC-10 30.79 11738368607 01-DEC-10 19.23
Solution
We use Oracle analytic function row_number() to generate rank for each customer_id based on the transaction time. The query is shown below.
SQL> with
tbl_temp as
(select a.*,
row_number() over
(partition by customer_id order by txn_dt desc) as rnk
from V_ALL_TXNS a)
select customer_id, txn_dt, txn_amt from
tbl_temp
where rnk <=10
order by customer_id, txn_dt desc;
CUSTOMER_ID TXN_DT TXN_AMT
-------------------- --------- ----------
11685988069 30-DEC-10 269.5
11685988069 30-DEC-10 150.56
11685988069 30-DEC-10 46.66
11685988069 29-DEC-10 12.94
11685988069 29-DEC-10 16.04
11685988069 28-DEC-10 18.33
11685988069 28-DEC-10 23.33
11685988069 23-DEC-10 174.71
11685988069 22-DEC-10 23.76
11685988069 20-DEC-10 194.79
11738368607 30-DEC-10 43.18
11738368607 30-DEC-10 15.2
11738368607 30-DEC-10 20
11738368607 29-DEC-10 49.98
11738368607 29-DEC-10 9.83
11738368607 28-DEC-10 209.8
11738368607 28-DEC-10 11.65
11738368607 28-DEC-10 18.41
11738368607 23-DEC-10 14.95
11738368607 20-DEC-10 36.99
11768488237 31-DEC-10 6.69
11768488237 31-DEC-10 4.62
11768488237 31-DEC-10 1.4
11768488237 30-DEC-10 6.69
11768488237 30-DEC-10 1.4
11768488237 29-DEC-10 2.92
11768488237 29-DEC-10 1.7
11768488237 29-DEC-10 2.8
11768488237 29-DEC-10 3.55
11768488237 28-DEC-10 1.7
No comments:
Post a Comment