2012-11-11 55 views
2

我有某種問題來理解的東西。簡單的SQL查詢與選擇和組

我有下表:

ID PROD PRICE 
1 A  10 
2 B  20 
3 C  30 
4 A  1 
5 B  12 
6 C  2 
7 A  7 
8 B  8 
9 C  9 
10 A  5 
11 B  2 

我想所有的督促所有的最低價格,這意味着我想獲得3個記錄,最低價格爲每刺。 從上面的例子,這就是我想:

ID PROD MIN(PRICE) 
4 A  1 
11 B  2 
6 C  2 

這是我寫的查詢:

select id, prod, min(price) 
from A1 
group by(prod); 

但是,這是我得到的記錄:

ID PROD MIN(PRICE) 
1 A  1 
2 B  2 
3 C  2 

正如你所看到的ID值是錯誤的,它只給了我一些行計數器,而不是實際的ID值。

您可以在下次link

檢查,我做錯了什麼?

+0

你的問題是,GROUP BY不會告訴你哪一行有最低的價格,只有那些最小值是。 – Neil

回答

6
SELECT a.* 
FROM A1 a 
     INNER JOIN 
     (
      SELECT Prod, MIN(Price) minPrice 
      FROM A1 
      GROUP BY Prod 
     ) b ON a.Prod = b.Prod AND 
       a.Price = b.minPrice 

對於MSSQL

SELECT ID, Prod, Price 
FROM 
(
    SELECT ID, Prod, Price, 
     ROW_NUMBER() OVER(Partition BY Prod ORDER BY Price ASC) s 
    FROM A1 
) a 
WHERE s = 1 
+0

這是什麼MS-SQL查詢?你能解釋一下我寫的 –

+0

@OfirA有什麼問題。看到我更新的答案。 –

+0

你能解釋一下我寫的是什麼問題,獲取ID列的問題是什麼? –

1

您萬畝不要使用MySQL或者PostgreSQL。

在標準SQL中,必須在GROUP BY子句中引用選擇列表中的所有非聚合列。

我不清楚你是否需要ID列。如果沒有,則使用:

SELECT prod, MIN(price) AS min_price 
    FROM A1 
GROUP BY prod; 

如果你需要匹配的ID號碼,然後變成一個子查詢:

SELECT id, prod, price 
    FROM A1 
    JOIN (SELECT prod, MIN(price) AS min_price 
      FROM A1 
     GROUP BY prod 
     ) AS A2 ON A1.prod = A2.prod AND A1.price = A2.min_price; 

能否請您解釋一下什麼是有問題我寫了什麼,是的,我需要ID列。

select id, prod, min(price) 
from A1 
group by(prod); 

在標準SQL中,你會得到一個錯誤信息(或者,如果沒有標準,在大多數SQL數據庫管理系統)。

如果允許您從GROUP BY子句中省略ID列,那麼您將獲得正確的prodMIN(price)值的ID的準隨機值。基本上,優化器會基於它的奇思妙想選擇它所知道的任何便利的ID。具體而言,它不會執行完整答案的子查詢和連接。例如,它可能會執行順序掃描,並且它返回的ID可能是給定的prod值遇到的第一個或最後一個,或者它可能是其他值 - 我甚至不確定該ID是否返回對於prod = 'A'必須是與prod = 'A'關聯的ID;你必須仔細閱讀手冊。基本上,你的查詢是不確定的,所以許多返回值是允許和「正確的」(但不是你想要的)。

請注意,如果按ID分組而不是prod,則prod中的結果將是確定的。這是因爲ID列是表的候選鍵(唯一標識符)。 (我相信PostgreSQL區分這兩種情況 - 但我不確定; MySQL不)

+0

你能解釋我寫的是什麼問題嗎?是的,我需要ID列。 –