在共享相同列值的记录组中选择“最大”记录

时间:2014-02-27 06:41:36

标签: sql oracle

我有一个包含c1,c2,c3和c4列的表。我必须在具有相同c1和c2的记录中检索具有max(c3)的记录行,所以我这样写。

select * 
  from XXX a 
 where not exists (
           select 1 
             from XXX b 
            where a.c1 = b.c1 
                  and a.c2 = b.c2 
                  and a.c3 > b.c3
        )      

但我的大四学生说这不高效,因为查询将全面扫描表两次。处理上述情况的更好方法是什么?

备注:我使用的是Oracle 11g。

示例输入: c1 c2 c3 c4 1 1 1 a 1 1 2 b 1 1 3 c 2 1 1 d 2 1 2 e

结果: c1 c2 c3 c4 1 1 3 c 2 1 2 e

5 个答案:

答案 0 :(得分:1)

请尝试:

select c1,
       c2,
       c3,
       c4 
From(
  select 
    XXX.*, 
    row_number() over (partition by c1 order by c3 desc) RNum
  from XXX
)x where Rnum=1

检查SQL Fiddle Demo

答案 1 :(得分:0)

试试这个:

SELECT MAX(c3) FROM XXX
WHERE c1=c2 

答案 2 :(得分:0)

我没有得到你的问题。但我仍然明白你想找到一个更好的方法来找到Max c3列。请试试这个 -

Select Max(c3) from XXXa,XXXb  where a.c1 = b.c1

答案 3 :(得分:0)

尝试:

select max(c3)
from table_name
where c1=c2;

答案 4 :(得分:0)

你可以通过使用......来做一个小组。

  

SELECT C1,          C2,          C3,          最大(C3)FROM XXX GROUP BY C1,             C2,             C3具有最大值(C3)= C3

我没有在Oracle上运行它,但我认为这是实现它的方法。

希望这有帮助。