oracle - 如何列出具有一列最大值的行

标签 oracle

我有一些数据库,如下例所示。

WITH TB AS(
     SELECT 'A' C1, 'B' AS C2, 1 AS N1, 1 AS N2 FROM DUAL UNION ALL
     SELECT 'A' C1, 'B' AS C2, 2 AS N1, 2 AS N2 FROM DUAL UNION ALL
     SELECT 'A1' C1, 'B1' AS C2, 1 AS N1, 3 AS N2 FROM DUAL UNION ALL
     SELECT 'A1' C1, 'B1' AS C2, 2 AS N1, 4 AS N2 FROM DUAL UNION ALL
     SELECT 'A1' C1, 'B1' AS C2, 3 AS N1, 1 AS N2 FROM DUAL UNION ALL
     SELECT 'A2' C1, 'B2' AS C2, 1 AS N1, 6 AS N2 FROM DUAL 
)
SELECT * FROM TB

如何列出具有 Max(N1) 的所有行,并按 C1、C2 分组,如下图所示?

enter image description here

最佳答案

问题中的要求描述不清楚,我猜测应该为每组C1+c2计算max(n1)。
如果是这种情况,那么您可以这样使用 MAX() OVER () 解析函数:

SELECT tb.*,
       max( n1 ) over (partition by c1, c2 ) xxxx
FROM TB;

| C1 | C2 | N1 | N2 | XXXX |
|----|----|----|----|------|
|  A |  B |  1 |  1 |    2 |
|  A |  B |  2 |  2 |    2 |
| A1 | B1 |  1 |  3 |    3 |
| A1 | B1 |  2 |  4 |    3 |
| A1 | B1 |  3 |  1 |    3 |
| A2 | B2 |  1 |  6 |    1 |

然后将上面的查询包装为子查询,并过滤掉不需要的行:

SELECT c1,c2,n1,n2 FROM (
  SELECT tb.*,
       max( n1 ) over (partition by c1, c2 ) xxxx
  FROM TB
)
WHERE n1 = xxxx

| C1 | C2 | N1 | N2 |
|----|----|----|----|
|  A |  B |  2 |  2 |
| A1 | B1 |  3 |  1 |
| A2 | B2 |  1 |  6 |

演示:http://sqlfiddle.com/#!4/d2fb9/4

关于oracle - 如何列出具有一列最大值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49333940/

相关文章:

oracle - weblogic.Server 创建域但不启动它( Chef Recipe )

sql - ORA-32033 : unsupported column aliasing : Oracle 10g

java - 如何在java odbc中编写 "select column name as "别名“来自表名”

sql - 为什么 Oracle SQL SELECT 表达式不打印十进制值?

oracle - 我可以在 PL/SQL 中返回一个函数吗?

oracle - libclntsh.so.11.1 : cannot open shared object file.

oracle - 小巧玲珑,小数加倍?解析列 X 时出错

java - Oracle 存储过程 - Spring 集成 - OUT 类型对象

sql - 在 View 中添加虚拟列

Oracle:仅导出模式