SQL不同的多列

时间:2016-06-08 08:41:12

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

我有一张表如下:

book_id   author_id     mark     year
   1          1          BAD     2014
   1          1         MEDIUM   2014
   1          1         GREAT    2015

我想执行一个查询,为每位作者提供最好的书。 像这样:

book_id   author_id     mark     year
   1          1         GREAT    2015

我尝试在多个字段上使用distinct关键字 - 但是当我这样做时:

select distinct book_id, author_id from Books 

我只得到book_id和author_id(正如预期的那样) - 但我也需要标记和年份 - 但我无法将其添加到不同的短语中。

目前我使用的是Postgres 9.4,但我需要一个ANSI-SQL解决方案。

我有办法做到吗?

1 个答案:

答案 0 :(得分:3)

通常使用窗口函数来解决

个问题:

select *
from (
   select book_id, author_id, mark, year, 
          row_number() over (partition by author_id order by case mark when 'GREAT' then 1 when 'MEDIUM' then 2 else 3 end) as rn
   from books
) t
where rn = 1;

以上是标准ANSI SQL,但在Postgres中使用(专有)distinct on通常要快得多:

select distinct on (author_id) book_id, author_id, mark, year, 
from books
order by author_id, 
         case mark when 'GREAT' then 1 when 'MEDIUM' then 2 else 3 end