2016-09-26 89 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