Sql 选择";“最大值”;记录共享相同列值的多组记录中的记录

Sql 选择";“最大值”;记录共享相同列值的多组记录中的记录,sql,oracle,Sql,Oracle,我有一个包含c1、c2、c3和c4列的表。我必须检索具有相同c1和c2的记录中最大值(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

我有一个包含c1、c2、c3和c4列的表。我必须检索具有相同c1和c2的记录中最大值(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
11A
1 12 b
1 13 c
2 1 d
2 1 2 e

结果:

c1 c2 c3 c4
1 13 c
2 1 2 e

试试这个:

SELECT MAX(c3) FROM XXX
WHERE c1=c2 

我不明白你的问题。但我理解的是,你想要一个更好的方法来查找Max c3列。请尝试这个-

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


你可以做一个小组并使用

选择C1, C2, C3, XXX组的最大值(C3)乘以C1, C2, 最大值(C3)=C3的C3

我还没有在甲骨文上运行过,但我认为这是一种方法

希望这有帮助。

请尝试:

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

检查

是否使用相同的c1和c2表示c1=c2对吗?给出示例输入和输出可能有助于澄清问题。您能否澄清为什么要在表上使用自联接?你能用一些输出清楚地解释这个问题吗?我只是添加了输入和输出示例,这可能有助于解释我的问题。“相同的c1和c2”表示两行具有相同c1和c2的记录。这并不意味着一行具有相同的c1和c2。您的SQL确实给出了正确的答案。但是当我尝试你的解决方案时,我的表有大约150万条记录。它的性能甚至比我的还要差。@user1664398-这似乎不太可能,因为它只在表中出现一次。也许你对真实问题的适应不太正确?查看这两个查询的执行计划可能会有所帮助。Alex,我同意你的看法。但这可能是由于建立在表上的索引不正确造成的。无论如何,谢谢TechDo的回答。事实上,它不应该是按c1划分的
,按c3描述划分的c2顺序吗?
?是的,你是对的,我在运行脚本时已经纠正了这一点。
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