如何选择第二列或第三列中具有最大值的行?在第一种情况下,最大值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
dwbf0jvd1#
在Oracle 12中,您可以在ORDER BY子句中使用GREATEST,然后使用FETCH FIRST ROW WITH TIES来只查询表一次:
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分析函数(同样,只查询一次表):
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
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
au9on6nz3#
或者使用where子句通过不相关的子查询检查合格行
where
select * from t where (select max(greatest(c2,c3)) from t) in (c2, c3)
3条答案
按热度按时间dwbf0jvd1#
在Oracle 12中,您可以在
ORDER BY
子句中使用GREATEST
,然后使用FETCH FIRST ROW WITH TIES
来只查询表一次:在Oracle 12之前,您可以使用
RANK
分析函数(同样,只查询一次表):其中,对于样本数据:
两个输出:
| C2| C3| C3 |
| - -----|- -----| ------------ |
| 2|三个| 3 |
| 三个|2| 2 |
fiddle
v1uwarro2#
您可以:
au9on6nz3#
或者使用
where
子句通过不相关的子查询检查合格行