2016-10-25 74 views
-2

我有一組數據一樣的:不能爲最多包含查詢得到正確的列值()

Nm | item | type | value 
21 | 19 | A | 15 
22 | 40 | B | 10 
21 | 20 | A | 80 
32 | 40 | C | 40 

我試了幾個疑問,我總是得到:(備案NM = 21)

Nm | item | type | max(value) 
21 | 19 | A | 80 

這不是我想要的,因爲最大值是從項目= 20

+0

什麼是NM = 21的記錄您的預期輸出 – TheGameiswar

+0

:項目應爲20不19 –

+0

*「我嘗試了幾種查詢」 * ... ...這是?當你甚至不能向我們展示你有多接近時,很難提供幫助,我們不可能發現你的誤解,因此我們可以幫助你學習。 –

回答

1

您需要查找特定nm具有最大值的行。爲此,您需要查找每個nm並在子查詢中查找最大值,然後將該最大值與主查詢進行比較。

查詢:

select * 
from item_table it_o 
where it_o.value in 
(select max(value) 
from item_table it_i 
where it_i.nm=it_o.nm) 

輸出:

nm item type value 
22 40  B 10 
21 20  A 80 
32 40  C 40 
+0

@TobySpeight完成:) –

+0

感謝您完成任務的完美查詢,並花費超過5分鐘時間獲取結果。非常感謝。 –

2
select 
    * from table t1 where nm=21 
    order by value desc 
    limit 1 
0
SELECT a.* 
    FROM YourTable a 
    JOIN 
    (SELECT nm 
      , MAX(value) value 
     FROM YourTable 
     GROUP 
      BY nm 
    ) b 
    ON b.nm = a.nm 
    AND b.value = a.value 
+0

有一些語法錯誤 – Strawberry

+0

現在更正...這只是別名問題 –

+0

不。仍然錯誤。 – Strawberry

0

你可以嘗試這樣的

select * from tablename where value = (SELECT MAX(value) FROM tablename) 

OR

select top 1 * from tablename order by value desc 
1
SELECT Nm, item, type, value 
    FROM (SELECT Nm, MAX(value) AS value 
      FROM YourTable 
     GROUP 
      BY Nm) AS m 
     NATURAL JOIN YourTable 
WHERE Nm = 21; 

我一直在問到所以這裏提供解釋得好:

首先,你需要找到的最大值(你沒有給表名,所以我要使用YourTable):

SELECT MAX(value) AS value 
    FROM YourTable 
WHERE item = 21 

其次,要項目,它需要連接上述回表表達式YourTable所有屬性,但我們不能這樣做,因爲我們還沒有投影Nm屬性。

人們很容易認爲,我們可以簡單的項目屬性:

SELECT Nm, MAX(value) AS value 
    FROM YourTable 
WHERE item = 21 

然而,這使得SQL BARF。

SELECT Nm, MAX(value) AS value 
    FROM YourTable 
WHERE item = 21 
GROUP 
    BY Nm 

現在我們可以一起回YourTable但同樣事情並非如此:要使用SQL的非常笨拙GROUP BY語法使SQL高興我們必須說,我們通過總結其列(不管它是多麼明顯!)簡單:

SELECT Nm, item, type, value 
    FROM (SELECT Nm, MAX(value) AS value 
      FROM YourTable 
     WHERE Nm = 21 
     GROUP 
      BY Nm) 
     NATURAL JOIN YourTable; 

同樣,SQL barfs因爲我們還沒有給出派生表的名字。現在你可能想知道,如果我們使用NATURAL JOIN,給它起一個名字有什麼意義,其中一個優勢是INNER JOIN,就是我們不需要範圍變量?那麼,沒有意義,這是不需要的。但是,SQL標準聲明它是必需的。因此,我們被迫包括名稱,毫無意義的,雖然它是:

SELECT Nm, item, type, value 
    FROM (SELECT Nm, MAX(value) AS value 
      FROM YourTable 
      WHERE Nm = 21 
      GROUP 
      BY Nm) AS pointless_name 
     NATURAL JOIN YourTable; 

注意我上面的SQL代碼是不同的:一個適用於自己的經驗來改變查詢的結構,使其通常更加有用(抱歉,我沒有超越直覺的解釋!)。

+0

@TobySpeight:請給我的解釋一讀。反饋總是歡迎:) – onedaywhen

+0

這是一個傑出的答案!感謝您的編輯。 –

1

你要做order by item desc所以最大值是第一位的,然後通過做limit 1

SELECT * FROM TABLE ORDER BY VALUE DESC LIMIT 1 

只選擇一排,也可以在子查詢中選擇最大的ID,然後在主查詢該ID(這種查詢可以返回多個行)

SELECT * FROM TABLE WHERE VALUE IN (SELECT MAX(VALUE) FROM TABLE) 
+0

你能否解釋一下你的問題在平局的情況下產生了什麼?我不認爲他們完全相同。 –

+0

這不是等價的,首先是首選,如果你使用大量數據,第二個查詢會導致性能問題,因爲它是交替地兩個查詢一個是子和一個是主 – Jazzzzz

+0

我是對的說第一個將只返回1行,而第二個將返回關節最大值的所有行?附:該問題需要'MAX(value)',所以你可以[edit]最大化'value'而不是'item' /'id'。 –