2016-11-27 19 views
0

假设我想从包含字段A,B,C,D,E的表ABC中进行选择,其中E是一个数字字段。GROUP BY返回字段的一个小子集

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

如果我尝试按A,B组进行GROUP,而只在E附近放置最大值,则会出现“not a GROUP BY expression”错误,但我确实只希望通过A,B进行GROUP。

我试图

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

,这是行不通的。

回答

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()

+0

这两个表现会更好吗?有没有办法摆脱包含row_number()列的中间表,而是在原始查询中仅使用ABC上的WHERE子句为每个A和B的组合提取所需的行?换句话说,我可以整合PARTITION和用WHERE子句提取所需的行吗? – user2371765

+0

我最好是想要这样的东西。 (ABC.A ,ABC.B )order by ABC.E)= 1 为此,我得到错误“窗口函数在这里是不允许的”。 – user2371765

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 
+0

这有效,但有什么办法可以避免连接和嵌套查询吗?例如,PARTITION是一种方式。 – user2371765