我的Postgresql数据库中有以下表格(为简单起见,截断了):
Person (id, name)
Book (id, person_id, title, check_out_date)
我需要一个查询,只会根据每人的check_out_date返回三本最新的图书。换句话说,如果一个人有5本书,我只希望查询返回3本最近的书籍记录。
更新:由于存在一些混淆,请让我澄清一下。如果我的Postgresql数据库有100个人的记录,我想查看每个人的书记录,限制每人3本书的回归。所以,如果一个人有5本书,我只想在查询中返回前3个。
答案 0 :(得分:1)
您可以使用with子句按人数降序选择书籍的顺序,并从书籍排在前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
;