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

私はベンダーが安いウィジェットを見つけたいので、以下のような出力:MySQLやSQLiteので

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

、私は

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