oracle 取第三大的值,多列比较,取值最大的前三列的值
时间: 2024-03-13 14:45:04 浏览: 22
要取第三大的值,可以使用ROW_NUMBER()函数结合ORDER BY子句和子查询来实现:
```
SELECT val
FROM (
SELECT val, ROW_NUMBER() OVER (ORDER BY val DESC) AS rn
FROM table
ORDER BY val DESC
)
WHERE rn = 3;
```
其中,ROW_NUMBER()函数按照val列的值降序排列,然后为每一行生成一个行号(即rn列),最后在外部查询中筛选行号为3的记录,即为第三大的值。
如果要取多列中值最大的前三列的值,可以使用DECODE函数结合子查询实现:
```
SELECT val
FROM (
SELECT DECODE(val1, MAX(val1), 1, 0) + DECODE(val2, MAX(val2), 1, 0) + DECODE(val3, MAX(val3), 1, 0) AS cnt, val
FROM table
)
WHERE cnt > 0
ORDER BY cnt DESC, val DESC
FETCH FIRST 3 ROWS ONLY;
```
其中,DECODE函数比较val1、val2、val3与它们的最大值是否相等,相等则返回1,否则返回0,然后将它们相加得到cnt列,表示有多少个值等于它们的最大值。在外部查询中筛选cnt大于0的记录,按照cnt和val降序排列,最后取前3行即为值最大的前三列的值。注意,FETCH FIRST 3 ROWS ONLY语句在Oracle 12c及以上版本中才支持,如果使用更早的版本可以使用ROWNUM来实现。