我知道SQL编程的基础知识,我知道如何在SQL Server中应用一些技巧来获得结果集,但我不知道Oracle中的所有技巧。
我有这些专栏:
col1 col2 col3
我写了这个查询
SELECT
col1, MAX(col3) AS mx3
FROM
myTable
GROUP BY
col1
我需要在找到col3最大值的同一行中得到col2的值,你知道解决这个问题的一些技巧吗?
答案 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