2015-10-29 3 views
-1

У меня есть следующий код, например:место функция даты в Oracle SQL

SELECT id, order_day, purchase_id FROM d 

customer_id и purchase_id являются уникальными. Каждый customer_id может иметь несколько purchase_id. Предположим, что каждый сделал не менее 5 заказов.

Теперь я просто хочу вытащить первые 5 идентификаторов покупки каждому клиенту ID (это зависит от самых ранних дат покупок). Я хочу, чтобы результат выглядел так:

id | purchase_id | rank 
------------------------- 
    A | WERFEW43 | 1 
    A | ERTGDSFV | 3 
    A | FDGRT45 | 2 
    A | BRTE4TEW | 4 
    A | DFGDV  | 5 
    B | DSFSF  | 1 
    B | CF345  | 2 
    B | SDFSDFSDFS | 4 

Я подумал о Рейтинге order_day, но мои знания не достаточно хорошо, чтобы это осуществить.

ответ

1
select id,purchase_id, rank() over (order by order_day) 
from d 

вы также можете попробовать dense_rank() over (order by order_day) и row_number() over (order by order_day) и выбрать один будет более подходящим для вас

+0

Это не работает. Только вернул 5 заказов в общей сложности только на день, а не по id. – LFB

+0

@VDL 'over (раздел по порядку id by order_day)' поможет. И чтобы вернуть только 5 строк, вы должны добавить условие 'WHERE'. См. @dnoeth answer – Tatiana

1
select * 
from 
(SELECT 
     id 
    ,order_day 
    ,purchase_id 
    ,row_number()     -- ranking 
     over (partition by id   -- each customer 
      order by order_day) as rn -- based on oldest dates 
    FROM d 
) as dt 
where rn <= 5 
+0

Хорошо работает. Благодаря! – LFB

Смежные вопросы