获取无分组列的值

时间:2015-08-19 16:57:58

标签: sql oracle select

我知道SQL编程的基础知识,我知道如何在SQL Server中应用一些技巧来获得结果集,但我不知道Oracle中的所有技巧。

我有这些专栏:

col1   col2   col3

我写了这个查询

SELECT 
    col1, MAX(col3) AS mx3 
FROM 
    myTable 
GROUP BY 
    col1

我需要在找到col3最大值的同一行中得到col2的值,你知道解决这个问题的一些技巧吗?

3 个答案:

答案 0 :(得分:2)

最简单的方法,恕我直言,不是使用max,而是使用窗口函数rank

SELECT col1 , col2, col3
FROM   (SELECT col1, col2, col3, 
               RANK() OVER (PARTITION BY col1 ORDER BY col3 DESC) rk
        FROM myTable) t
WHERE  rk = 1
BTW,相同的语法也适用于MS SQL-Server和大多数其他现代数据库,其中MySQL是一个值得注意的例外。

答案 1 :(得分:1)

有两种不同的方法可以做到这一点:

在这两种情况下,我都将初始查询视为公用表表达式或内联视图,并将其连接回基表以获取添加的列。这里的诀窍是INNER JOIN消除了最大查询中没有的所有记录。

SELECT A.*,
FROM myTable A
INNER JOIN (SELECT col1 , MAX( col3 ) AS mx3 FROM myTable GROUP BY col1) B
 on A.Col1=B.Col1
and B.mx3 = A.Col3

with CTE AS (SELECT col1 , MAX( col3 ) AS mx3 FROM myTable GROUP BY col1)
SELECT A.*
FROM MyTable A
INNER JOIN CTE
 on A.col1 = B.Col1
and A.col3= cte.mx3

答案 2 :(得分:0)

这是一种替代方案,它只是通过查询稍微扩展现有组(即,不需要多次查询同一个表):

with mytable as (select 1 col1, 1 col2, 1 col3 from dual union all
                 select 1 col1, 2 col2, 2 col3 from dual union all
                 select 1 col1, 1 col2, 3 col3 from dual union all
                 select 1 col1, 3 col2, 3 col3 from dual union all
                 select 2 col1, 10 col2, 1 col3 from dual union all
                 select 2 col1, 23 col2, 2 col3 from dual union all
                 select 2 col1, 12 col2, 2 col3 from dual)
SELECT 
    col1,
    MAX(col2) keep (dense_rank first order by col3 desc) mx2,
    MAX(col3) AS mx3 
FROM 
    myTable 
GROUP BY 
    col1;

      COL1        MX2        MX3
---------- ---------- ----------
         1          3          3
         2         23          2