2016-11-27 46 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