GROUP BY PostgreSQL查询我需要一个不在GROUP BY子句中的列

时间:2016-09-26 20:58:07

标签: sql postgresql greatest-n-per-group rails-postgresql

我有一个与下面的'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似乎是完全合理的。

我做错了什么?

1 个答案:

答案 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