2014-02-27 94 views
-2

我有一个包含列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

+0

用相同的C1和C2手段C1 = C2吧? – TechDo

+0

给出样本输入和输出可能有助于清除问题 – hkutluay

+0

您能澄清为什么在表上使用自连接吗?你能否用一些输出清楚地解释这个问题? – user1658435

回答

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

+0

你的SQL确实给出了正确的答案。但是当我尝试你的解决方案时,我的桌子上有大约150万条记录。它的表现甚至比我的更糟。 – user1664398

+0

@ user1664398 - 这似乎不大可能,因为它只能击中表格一次。也许你对你的真实查询的改编不完全正确?查看这两个查询的执行计划可能会有所帮助。 –

+0

Alex,我同意你的意见。但这可能是由于在表格上建立了不正确的索引。无论如何,感谢TechDo的回答。 – user1664398

0

试试这个:

SELECT MAX(c3) FROM XXX 
WHERE c1=c2 
0

我没有得到你的question.but还是什么,我明白的是,你想有一个更好的办法找到Max c3色谱柱。请试试这个 -

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

尝试:

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

您可以通过并采用做一团......

SELECT C1,C2 , C3, MAX(C3)FROM XXX GROUP BY C1, C2,C3 HAVING MAX(C3)= C3

我没有跑这对甲骨文,但我认为这是做的方式它。

希望这会有所帮助。