2012-02-03 12 views
0

私はこのようなテーブルを持っているため2フィールドを使用して1つのフィールド:クエリPOSTGRESQL</strong><strong>に句

Column  |   Type    | Modifiers 
---------------+-----------------------------+----------- 
id   | smallint     | not null 
merchant_id | smallint     | not null 
batch_no  | smallint     | not null 

私はこのようなクエリを持っているが:

select merchant_id , max(batch_no) from batch group by merchant_id 

それは、このような値を返します。

 merchant_id | max 
-------------------+------ 
       14 | 593 
       45 | 1 
       34 | 3 
       46 | 1 
       25 | 326 
       27 | 61 
       17 | 4 

どのように各データのIDを取得できますか?上記のデータのIDは1の結果を得るためにどのようなクエリを使用できますか?

+0

あなたもidを引き出す必要があるようです。あなたのケースでは、 'select id、merchant_id、max(batch_no)バッチグループby merchant_id'から – kobaltz

+0

IDとmerchant_IDの関係は何ですか? SELECT * FROMバッチの最初の5行またはそれ以上の行をポストできますか? – Aaron

答えて

1

このクエリは、ウィンドウ関数があった前であっても、PostgreSQLの任意のバージョンで動作します(はPostgreSQL 8.3またはそれ以前):merchant_idごとに一意であるべきではありません

SELECT b.id, b.merchant_id, b.batch_no 
FROM batch b 
JOIN (
    SELECT merchant_id, max(batch_no) AS batch_no 
    FROM batch 
    GROUP BY merchant_id 
    ) bmax USING (merchant_id, batch_no) 

batch_no場合、あなたはごとに複数の行を取得しますmerchant_id


のPostgreSQL 8.4以降 を使用すると、window function first_value()を使用します。これもmerchant_idごとに一意の行を生成する

SELECT DISTINCT 
     merchant_id 
    , first_value(batch_no) OVER w 
    , first_value(id) OVER w 
FROM batch 
GROUP BY merchant_id 
WINDOW w AS (PARTITION BY merchant_id ORDER BY batch_no DESC, id) 

batch_noは一意である必要がない場合。この場合、さらにidでウィンドウをソートするので、最小idbatch_no/merchant_id)が選択されます。

ここではを使用しています。これは、の後にに適用されているためです(GROUP BYではなく)。

+0

こんにちはerwin、あなたの答えのためのthx ..それは動作しますが、私は "USING"機能について1つの質問をしたいと思います。目的は何ですか? –

+1

@DiazPradiananto: 'USING'は、JOIN条件の省略表現です。 [こちら]のマニュアル(http://www.postgresql.org/docs/current/interactive/sql-select.html#SQL-FROM)をお読みください。 –

+0

あなたの助けにthy erwin –