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中是合法的.我错过了什么明显的解决方案?
如果(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)
| 归档时间: |
|
| 查看次数: |
686 次 |
| 最近记录: |