2014-02-27 48 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

我沒有跑這對甲骨文,但我認爲這是做的方式它。

希望這會有所幫助。