2014-09-26 54 views
4

我有表結構,如:查找列中的最大值爲每個分區

CREATE TABLE new_test 
(col1 NUMBER(2) NOT NULL, 
    col2 VARCHAR2(50) NOT NULL, 
    col3 VARCHAR2(50) NOT NULL, 
    col4 VARCHAR2(50) NOT NULL 
); 

它具有數據:

col1 col2 col3 col4 
0   A  B  X 
1   A  B  Y 
2   A  B  Z 
1   C  D  L 
3   C  D  M 

我需要找到COL4這對組合的最大價值的價值col2和col3。例如我的結果應該是:

col4 
    Z 
    M 

我試圖使用Oracle分析功能:

SELECT col4, MAX(col1) OVER (PARTITION BY col2, col3) FROM (
SELECT col2, col3, col4, col1 
FROM new_test); 

但預期它不工作。你能幫我解決這個問題嗎?

更新: 我可以使它工作使用:

SELECT a.col4 
FROM new_test a, 
    (SELECT col2, 
    col3, 
    col4, 
    MAX(col1) OVER (PARTITION BY col2, col3) AS col1 
    FROM new_test 
) b 
WHERE a.col2 = b.col2 
AND a.col3 = b.col3 
AND a.col4 = b.col4 
AND a.col1 = b.col1; 

是否有比這更好的辦法?

回答

5

如果您期望的結果:

col4 
    Z 
    M 

你應該寫:

SELECT MAX(col4) AS col4 FROM new_test GROUP BY col2,col3 

這將返回col4列中發現的最大值爲每雙col2,col3


如果您需要:

COL2 COL3 COL4 
A  B  Z 
C  D  M 

寫:

SELECT col2,col3,MAX(col4) AS col4 FROM new_test GROUP BY col2,col3 

最後,如果你需要:

COL1 COL2 COL3 COL4 
2  A  B  Z 
3  C  D  M 

有許多變化。喜歡這個:

SELECT col1,col2,col3,col4 
    FROM new_test 
    NATURAL JOIN (SELECT col2,col3,MAX(col4) AS col4 
        FROM new_test GROUP BY col2,col3) 
+0

親愛的Sylvain,非常感謝。與我的相比,您的查詢相當容易閱讀。但我觀察到兩種查詢的性能都是一樣的。有沒有更好的/高性能的方法? – user613114 2014-09-27 03:30:42

+0

@ user613114關於表演:我的第一個嘗試是在col2,col3,col4上添加一個複合索引。但是,如果不知道你的表格結構(「鍵」)和執行計劃,就很難說更多。隨意爲此提出一個其他問題! – 2014-09-27 10:16:18

+0

謝謝Sylvain的幫助。我去做。 – user613114 2014-09-29 05:13:34

相關問題