我如何在sql中使用max()

BIB*_*IBD 1 sql oracle greatest-n-per-group

我有一个看起来像这样的表:

col1   col2  col3  
------ ----- ----- 
A      1     trout
A      2     trout
B      1     bass
C      1     carp
C      2     tuna
D      1     salmon
Run Code Online (Sandbox Code Playgroud)

我真的只想选择col2最大值的行.

我想要生成的查询将返回以下内容:

col1   col2  col3  
------ ----- ----- 
A      2     trout
B      1     bass
C      2     tuna
D      1     salmon
Run Code Online (Sandbox Code Playgroud)

我尝试过这样的事情:

select col1, max (col2) as mCol2, col3
from mytable
group by col1, col2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到:

col1   Mcol2 col3  
------ ----- ----- 
A      2     trout
B      1     bass
C      1     carp
C      2     tuna
D      1     salmon
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,C, 1, carp当我只想要时,我仍然会得到C, 2, tuna.

我考虑过尝试做类似的事情

select col1, col2, col3
from mytable
where 
    col1-n-col2 in (
        select col1, max (col2) as mCol2
        from mytable)
group by col1, col2
Run Code Online (Sandbox Code Playgroud)

但我不认为这在SQL中是合法的.我错过了什么明显的解决方案?

Mar*_*ers 7

如果(col1,col2)是唯一的,或者如果你不介意在tie的情况下重复:

SELECT T1.col1, T1.col2, T1.col3
FROM mytable T1
JOIN (
    SELECT col1, MAX (col2) AS mCol2
    FROM mytable
    GROUP BY col1
) T2
ON T1.col1 = T2.col1
AND T1.col2 = T2.mCol2
Run Code Online (Sandbox Code Playgroud)

如果你想在平局的情况下选择任何一行(需要ROW_NUMBER支持,即不需要MySQL):

SELECT col1, col2, col3
FROM (
     SELECT
         col1, col2, col3,
         ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2 DESC) AS rn
     FROM mytable
) T1
WHERE rn = 1
Run Code Online (Sandbox Code Playgroud)