GROUP BY 返回字段的一小部分

GROUP BY a small subset of returned fields

假设我想 select 来自包含字段 A、B、C、D、E 的 table ABC,其中 E 是数字字段。

对于 AB 的给定组合,我想 return 包含最大值 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

这行不通。

这不需要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 值,这将 return 重复。另一种方法使用 ANSI 标准 window 函数:

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

这 return 一个(任意)行,如果有重复的最大 e 值。如果您希望使用此方法重复,则可以使用 rank()dense_rank() 而不是 row_number()

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