我有一个看起来像这样的表:
col1 col2 col3
------ ----- -----
A 1 trout
A 2 trout
B 1 bass
C 1 carp
C 2 tuna
D 1 salmon
我真的只想选择col2最大值的行。
我想要生成的查询将返回以下内容:
col1 col2 col3
------ ----- -----
A 2 trout
B 1 bass
C 2 tuna
D 1 salmon
我尝试过这样的事情:
select col1, max (col2) as mCol2, col3
from mytable
group by col1, col2
在这种情况下,我得到:
col1 Mcol2 col3
------ ----- -----
A 2 trout
B 1 bass
C 1 carp
C 2 tuna
D 1 salmon
正如您所看到的,当我只想要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
但我不认为这在SQL中是合法的。我错过了什么明显的解决方案?
答案 0 :(得分:7)
如果(col1,col2)是唯一的,或者如果你不介意关系中的重复:
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
如果你想在平局的情况下选择任何一行(需要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
答案 1 :(得分:3)
分析函数是解决此类问题的最佳方法,因为它们比大型数据集上的子查询执行得更好。
尝试Mark Byers提供的第二个查询或尝试下面显示的查询:
select
col1,
max (col2) as mCol2,
max (col3) keep (dense_rank last order by col2) as col3
from mytable
group by col1
这使用LAST
analytic function在按col2排序后获取每个组中的最后一个值。 <* 1}}用于col3是语法所必需的,但实际上只是一个打破平局。
答案 2 :(得分:1)
你很亲密
select t.col1, t.col2, t.col3
from mytable t,
(select col1,
max (col2) as mx
from mytable
group by col1) m
where m.col1 = t.col1
and m.mx = t.col2
答案 3 :(得分:1)
您没有指定使用哪个数据库 - 在SQL Server和其他一些数据库上,您可以使用带窗口函数的CTE(公用表表达式)来获取行:< / p>
;WITH HighestOnly AS
(
SELECT
col1, col2, col3,
ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2 DESC) AS 'RowNum'
FROM
MyTable
)
SELECT
col1, col2, col3
FROM
HighestOnly
WHERE
RowNum = 1
这将按照指定的条件(col1
)对数据进行“分区”,并从每个数据分区开始连续编号,从一个开始 - 按给定的第二个标准(col2 DESC
)排序。因此,对于数据的每个“分区”,col2
中具有最高值的行将具有RowNum = 1
- 这就是我在此处选择的内容。
答案 4 :(得分:0)
尝试
select mytable.col1, mytable.col2, mytable.col3
from mytable
join
( select col1, max(col2) as col2
from mytable
group by col1) as mytablemax
on mytable.col1 = mytablemax.col1
and mytable.col2 = mytablemax.col2
答案 5 :(得分:0)
这是一种方法
With max_qry as
(select col1, max(col2) as mcol2 from mytable group by col1)
select m.col1, m.col2, m.col3
from mytable m join max_qry on m.col1 = mq.col1 and m.col2 = mq.mcol2
答案 6 :(得分:0)
开平..
我没有安装Oracle数据库但是对于MySQL这是错误的..
这是因为你的语法空间......正确的版本是
SELECT MAX(column) ...
而不是
SELECT MAX (column) ...
我不认为空间被认为是一种功能......