2016-09-26 150 views
0

我有一個數據庫,它與下面的'小部件'數據庫相似。GROUP BY PostgreSQL查詢我需要一個不在GROUP BY子句中的列

widget_id | vendor_id | price 
------------------------------ 
    1  | 101 | 10.00 
    2  | 101 | 9.00 
    3  | 102 | 6.00 
    4  | 102 | 7.00 

我想找到供應商最廉價的部件,所以像下面的輸出:

widget_id | vendor_id | price 
------------------------------ 
    1  | 101 | 10.00 
    3  | 102 | 6.00 

在MySQL或SQLite的,我可以查詢

SELECT widget_id, vendor_id, min(price) AS price FROM widgets GROUP BY(vendor_id) 

然而,似乎這與SQL規範相反。在PostgreSQL中,我無法運行上述查詢。錯誤消息是「widget_id必須出現在GROUP BY子句中或在聚合函數中使用」。我可以看到PostgreSQL的觀點,但想要擁有最低價格的小部件的widget_id似乎是完全合理的。

我在做什麼錯?

+1

您在MySQL和SQLite中的代碼不正確。不保證返回正確的結果。 –

回答

1

您可以使用DISTINCT ON

SELECT DISTINCT ON (vendor_id) * 
FROM widget 
ORDER BY vendor_id, price; 

您也可以使用row_number窗函數在子查詢:

SELECT widget_id, vendor_id, price 
FROM (
    SELECT *, row_number() OVER (PARTITION BY vendor_id ORDER BY price) AS rn 
    FROM widget 
) t 
WHERE rn=1; 

Finaly,你也可以做它用LATERAL加入:

SELECT t2.* 
FROM 
    (SELECT DISTINCT vendor_id FROM widget) t1, 
    LATERAL (SELECT * FROM widget WHERE vendor_id=t1.vendor_id ORDER BY price LIMIT 1) t2