如何获取重复行ID之间的最大列值?

时间:2014-05-12 14:53:22

标签: sql oracle plsql oracle11g

我正在处理Oracle 11g数据库查询,该查询需要检索表中重复行之间的最高NUM值列表。

以下是我的背景示例:

ID  |  NUM
------------
1   |  1111 
1   |  2222 
2   |  3333
2   |  4444
3   |  5555
3   |  6666

以下是执行查询后我期望的结果:

NUM
----
2222    
4444
6666

我知道如何在数字列表中获取GREATEST值,但我完全没有猜测如何对两行进行分组,如果它们具有相同的ID,则获取它们之间的最大列值。

Programmaticaly它很容易实现,但使用SQL它对我来说往往不那么直观。欢迎任何建议或建议,因为我甚至不知道哪个功能可以帮助我在Oracle中这样做。

谢谢!

2 个答案:

答案 0 :(得分:5)

这是GROUP BY的典型用例。假设你的Num字段可以比较:

SELECT ID, MAX(NUM) as Max
FROM myTable
GROUP BY ID

如果您不想选择ID(如您提供的输出中所示),则可以运行

SELECT Max
FROM (
    SELECT ID, MAX(NUM) as Max
    FROM myTable
    GROUP BY ID
) results

here是SQL小提琴

修改:如果您NUM VARCHAR2,如后所述Int,那么您必须将其转换为{{1}}。 See this question

答案 1 :(得分:0)

我建议的最有效方式是

SELECT ids, 
       value 
FROM   (SELECT ids, 
               value, 
               max(value) 
                 over ( 
                   PARTITION BY ids) max_value 
        FROM   test) 
WHERE  value = max_value; 

这要求查询保持到目前为止遇到的最大值的每个id的单个值。如果找到新的最大值,则修改现有值,否则丢弃新值。必须在内存中保留的元素总数与id的数量有关,而不是与扫描的行数有关。

请参阅此SQLFIDDLE