Postgresql - 在列中获取具有最大值的行

时间:2017-02-16 10:40:46

标签: sql postgresql greatest-n-per-group

我想形成一个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)并将其与发布者和图书一起加入,我可能会收到每个国家/地区的多行。我怎样才能达到预期的效果?

3 个答案:

答案 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]抓住了列表中的第一个项目,嘿,你有一个炖肉。