假设我想从包含字段A,B,C,D,E的表ABC中进行选择,其中E是数字字段。
对于A
和B
的给定组合,我想返回包含最大值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
这不起作用。
答案 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