我如何在sql中使用max()

时间:2011-09-30 21:07:33

标签: 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

我真的只想选择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中是合法的。我错过了什么明显的解决方案?

7 个答案:

答案 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) ...

我不认为空间被认为是一种功能......