2012-03-08 2 views
0

я следующие таблицы в моей базе данных Postgresql (trunc'ed для простоты):запрос, чтобы ограничить количество результатов на запись на основе даты

Person (id, name) 
Book (id, person_id, title, check_out_date) 

Мне нужен запрос, который будет возвращать только три самые последние книги, основанные на check_out_date на человека. Другими словами, если у человека есть 5 книг, я хочу, чтобы запрос возвращал 3 последних книжных запися.

ОБНОВЛЕНИЕ: Поскольку возникла некоторая путаница, позвольте мне уточнить. Если в моей базе данных Postgresql есть 100 записей Person, я хочу просмотреть записи Book для каждого человека, ограничивая то, что возвращается на 3 книги на человека. Итак, если у Человека есть 5 книг, мне нужны только первые 3, возвращенные в запросе.

ответ

1

Вы можете использовать с оговоркой, что выбирает порядок книг человек нисходящих и выбрать из тех, где книги находятся в верхней 3.

with tmp as (
    select 
    b.id, 
    b.person_id, 
    b.title, 
    b.check_out_date, 
    row_number() over (partition by b.person_id order by b.check_out_date desc) as order_pos 
    from 
    book b 
) 
select 
    t.id, 
    t.person_id, 
    t.title, 
    t.check_out_date 
from 
    tmp t 
where 
    t.order_pos <= 3 
; 
Смежные вопросы