oracle 基于2列选择最大值行

l3zydbqr  于 2023-06-29  发布在  Oracle
关注(0)|答案(3)|浏览(155)

如何选择第二列或第三列中具有最大值的行?
在第一种情况下,最大值30在row3中,因此返回row3

A, 1, 10
B, 2, 11
C, 30, 12

=> C, 30, 12

在第二种情况下,最大值位于第2行,因此返回第2行

A, 1, 10
B, 2, 31
C, 30, 12

=> B, 2, 31

在最后一种情况下,最大值位于第2行和第3行,因此返回两个值。

A, 1, 10
B, 2, 31
C, 31, 12

=> B, 2, 31
=> C, 31, 12
dwbf0jvd

dwbf0jvd1#

在Oracle 12中,您可以在ORDER BY子句中使用GREATEST,然后使用FETCH FIRST ROW WITH TIES来只查询表一次:

SELECT *
FROM   table_name
ORDER BY GREATEST(column2, column3) DESC
FETCH FIRST ROW WITH TIES

在Oracle 12之前,您可以使用RANK分析函数(同样,只查询一次表):

SELECT *
FROM   (
  SELECT t.*,
         RANK() OVER (ORDER BY GREATEST(column2, column3) DESC) AS rnk
  FROM   table_name t
)
WHERE  rnk = 1;

其中,对于样本数据:

CREATE TABLE test (c1, c2, c3) AS
SELECT 'a', 1, 1 FROM DUAL UNION ALL
SELECT 'b', 2, 3 FROM DUAL UNION ALL
SELECT 'c', 3, 2 FROM DUAL;

两个输出:
| C2| C3| C3 |
| - -----|- -----| ------------ |
| 2|三个| 3 |
| 三个|2| 2 |
fiddle

v1uwarro

v1uwarro2#

您可以:

with m as (select max(greatest(col2, col3)) as g from t)
select * from t cross join m 
where t.col2 = m.g or t.col3 = m.g
au9on6nz

au9on6nz3#

或者使用where子句通过不相关的子查询检查合格行

select * 
from t
where (select max(greatest(c2,c3)) from t) in (c2, c3)

相关问题