我有一个与下面的'widget'数据库平行的数据库。
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似乎是完全合理的。
我做错了什么?
答案 0 :(得分: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;
最后,你也可以使用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