GROUP BY 返回字段的一小部分
GROUP BY a small subset of returned fields
假设我想 select 来自包含字段 A、B、C、D、E 的 table ABC,其中 E 是数字字段。
对于 A
和 B
的给定组合,我想 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
假设我想 select 来自包含字段 A、B、C、D、E 的 table ABC,其中 E 是数字字段。
对于 A
和 B
的给定组合,我想 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