我想形成一个sql查询,它返回一些行的数据,这些行在某些组中具有最大值。请考虑以下示例进行演示:
有三个表:国家,出版商和图书。每个发布者属于一个国家/地区,每本图书都有一个发布者定义可能看起来像
Country(country_id, country_name)
Publisher(pub_id, pub_name, fk_pub_country)
Book(book_id, book_name, release_date, fk_book_publisher)
我想选择(country_id,book_name)按国家/地区分组,以便每行包含该国家/地区中最近发布的图书的名称。如果在同一天发布了多本图书,我应该获得ID最高的图书。
如果我只使用-clause和max分组,我就不能包含书名。如果我选择了view(country_id,max_date)并将其与发布者和图书一起加入,我可能会收到每个国家/地区的多行。我怎样才能达到预期的效果?
答案 0 :(得分:3)
SELECT DISTINCT ON (country_id)
country_id,
book_name
FROM country
JOIN publisher ON fk_pub_country = country_id
JOIN book ON fk_book_publisher = pub_id
ORDER BY
country_id,
release_date DESC,
book_id DESC
答案 1 :(得分:0)
您可以使用子查询:
select c.country_id,
(select b.book_name
from Book b
join Publisher p on p.pub_id = b.fk_book_publisher
where p.fk_pub_country = c.country_id
order by b.release_date desc, b.book_id desc limit 1) as book_name
from Country c
答案 2 :(得分:0)
你说:
如果我只是按-clause和max使用group,我就不能包含这本书 名。
但是你不能让Postgres像你一样抱怨你。只需从结果数组中获取第一个 n 排序记录(未经测试):
SELECT
country_id,
(array_agg(book_name))[1] as book_name
FROM country
JOIN publisher ON fk_pub_country = country_id
JOIN book ON fk_book_publisher = pub_id
GROUP BY country_id ORDER BY release_date DESC;
因为他们按照你想要的顺序排序,(array_agg(...))[1]
抓住了列表中的第一个项目,嘿,你有一个炖肉。