GROUP BY返回字段的一小部分

时间:2016-11-27 13:57:23

标签: sql greatest-n-per-group

假设我想从包含字段A,B,C,D,E的表ABC中进行选择,其中E是数字字段。

对于AB的给定组合,我想返回包含最大值E的行。我该怎么做呢?我GROUP BY怎么办?

如果我尝试按A,B进行分组,同时将最大值仅放在E附近,我会收到“not a GROUP BY expression”错误,但我确实想要只用A,B组合。

我试过

select A,B,C,D,max(E)
from ABC
group by A,B

这不起作用。

2 个答案:

答案 0 :(得分:1)

这不需要group by。一种典型的方式是:

select abc.*
from abc
where abc.e = (select max(abc2.e) from abc abc2 where abc.a = abc2.a and abc.b = abc2.a);

但是,如果多行具有相同的最大e值,则会返回重复项。另一种方法使用ANSI标准窗口函数:

select abc.*
from (select abc.*,
             row_number() over (partition by a, b order by e desc) as seqnum
      from abc
     ) abc
where seqnum = 1;

如果存在重复的最大e值,则返回一行(任意)行。如果您希望使用此方法重复,则可以使用rank()dense_rank()代替row_number()

答案 1 :(得分:1)

select t1.*
from ABC t1
join
(
    select A,B,max(E) as maxE
    from ABC
    group by A,B
) t2 on t1.a = t2.a and t1.b = t2.b and t1.e = t2.maxE