2014-05-06 24 views
0

我有以下的表名爲foo:的Oracle SQL:正從特定的多個條件的所有行最大數量

ID | D1 | D2 | D3 | 
--------------------- 
1 | 47 | 3 | 71 | 
2 | 47 | 98 | 82 | 
3 | 0 | 99 | 3 | 
4 | 3 | 100 | 6 | 
5 | 48 | 10 | 3 | 
6 | 49 | 12 | 4 | 

我想運行一個選擇查詢,並有實驗結果表明這樣

ID | D1 | D2 | D3 | Result | 
------------------------------ 
1 | 47 | 3 | 71 | D3  | 
2 | 47 | 98 | 82 | D2  | 
3 | 0 | 99 | 3 | D2  | 
4 | 3 | 100 | 6 | D2  | 
5 | 48 | 10 | 3 | D1  | 
6 | 49 | 12 | 4 | D1  | 

所以,基本上我想在D1,D2,D3列除以id之間取得最大值。 ,你可能看到的,ID 1具有D3在自 D1之間的最大值的結果列:D2:D3

這意味着4:3:71,最大值爲71。這就是爲什麼結果顯示「D3」

有沒有辦法在SQL查詢中做到這一點?

謝謝!

+1

的MySQL或Oracle?正確標記它。 –

+1

1.看到規範化 – Strawberry

+0

@AhhikChakraborty:它實際上是Oracle數據庫,但我想知道如何在SQL查詢中做到這一點? –

回答

0

考慮以下 - 一個標準化的方法...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL 
,d INT NOT NULL 
,val INT NOT NULL 
,PRIMARY KEY(id,d) 
); 

INSERT INTO my_table VALUES 
(1,1,47), 
(2,1,47), 
(3,1,0), 
(4,1,3), 
(5,1,48), 
(6,1,49), 
(1,2,3), 
(2,2,98), 
(3,2,99), 
(4,2,100), 
(5,2,10), 
(6,2,12), 
(1,3,71), 
(2,3,82), 
(3,3,3), 
(4,3,6), 
(5,3,3), 
(6,3,4); 

SELECT * FROM my_table; 
+----+---+-----+ 
| id | d | val | 
+----+---+-----+ 
| 1 | 1 | 47 | 
| 1 | 2 | 3 | 
| 1 | 3 | 71 | 
| 2 | 1 | 47 | 
| 2 | 2 | 98 | 
| 2 | 3 | 82 | 
| 3 | 1 | 0 | 
| 3 | 2 | 99 | 
| 3 | 3 | 3 | 
| 4 | 1 | 3 | 
| 4 | 2 | 100 | 
| 4 | 3 | 6 | 
| 5 | 1 | 48 | 
| 5 | 2 | 10 | 
| 5 | 3 | 3 | 
| 6 | 1 | 49 | 
| 6 | 2 | 12 | 
| 6 | 3 | 4 | 
+----+---+-----+ 

SELECT x.* 
    FROM my_table x 
    JOIN 
    (SELECT id,MAX(val) max_val FROM my_table GROUP BY id) y 
    ON y.id = x.id 
    AND y.max_val = x.val; 
+----+---+-----+ 
| id | d | val | 
+----+---+-----+ 
| 1 | 3 | 71 | 
| 2 | 2 | 98 | 
| 3 | 2 | 99 | 
| 4 | 2 | 100 | 
| 5 | 1 | 48 | 
| 6 | 1 | 49 | 
+----+---+-----+ 

(這是打算作爲一個MySQL的解決方案 - 我不熟悉ORACLE語法,所以道歉,如果這沒有端口)

這是否回答您的評論?

SELECT x.* , y.max_val 
    FROM my_table x 
    JOIN 
    (SELECT id,MAX(val) max_val FROM my_table GROUP BY id) y 
    ON y.id = x.id ; 
+----+---+-----+---------+ 
| id | d | val | max_val | 
+----+---+-----+---------+ 
| 1 | 1 | 47 |  71 | 
| 1 | 2 | 3 |  71 | 
| 1 | 3 | 71 |  71 | 
| 2 | 1 | 47 |  98 | 
| 2 | 2 | 98 |  98 | 
| 2 | 3 | 82 |  98 | 
| 3 | 1 | 0 |  99 | 
| 3 | 2 | 99 |  99 | 
| 3 | 3 | 3 |  99 | 
| 4 | 1 | 3 |  100 | 
| 4 | 2 | 100 |  100 | 
| 4 | 3 | 6 |  100 | 
| 5 | 1 | 48 |  48 | 
| 5 | 2 | 10 |  48 | 
| 5 | 3 | 3 |  48 | 
| 6 | 1 | 49 |  49 | 
| 6 | 2 | 12 |  49 | 
| 6 | 3 | 4 |  49 | 
+----+---+-----+---------+ 
+0

謝謝你先生的回答,我非常感謝。但我打算做的是收集每一行的所有最大值,我的意思是如果你正在查看上面的數據..
有18行計算,所以如果我們計算每個屬性的最大值,它也應該包含18行。 –

+0

我不明白...但請參閱上面的修改 – Strawberry

3

對於Oracle,請試試這個

select foo.*, case when greatest(d1, d2, d3) = d1 then 'D1' 
        when greatest(d1, d2, d3) = d2 then 'D2' 
        when greatest(d1, d2, d3) = d3 then 'D3' 
       end result 
from foo 
+0

如果輸入數據可能包含NULL值,那麼添加一些NVL()調用將是明智的 - 最大( )如果其中一個參數爲NULL,則返回NULL。 –

+0

它是由主題啓動 –

+0

請你請告訴我如何使用上面提到的NVL()調用?因爲有些列中的數據值可能爲空。 –

0

@Strawberry

這是我真正想要的先生:

+----+---+-----+------+--------+ 
| id | d | val | val2 |max_val | 
+----+---+-----+------+--------+ 
| 1 | 1 | 47 | 42 | 47 | 
| 1 | 2 | 3 | 41 | 41 | 
| 1 | 3 | 71 | 35 | 71 | 
| 2 | 1 | 47 | 27 | 47 | 
| 2 | 2 | 98 | 78 | 98 | 
| 2 | 3 | 82 | 97 | 97 | 
| 3 | 1 | 0 | 3 | 3 | 
| 3 | 2 | 99 | 47 | 99 | 
| 3 | 3 | 3 | 54 | 54 | 
| 4 | 1 | 3 | 45 | 45 | 
| 4 | 2 | 100 | 45 | 100 | 
| 4 | 3 | 6 | 45 | 45 | 
| 5 | 1 | 48 | 47 | 48 | 
| 5 | 2 | 10 | 12 | 12 | 
| 5 | 3 | 3 | 70 | 70 | 
| 6 | 1 | 49 | 39 | 49 | 
| 6 | 2 | 12 | 13 | 13 | 
| 6 | 3 | 4 | 17 | 17 | 
+----+---+-----+------+--------+ 

但是再一次,感謝您的答案:d

相關問題