2012-02-03 91 views
0

我有表這樣2字段中POSTGRESQL查詢1場使用where子句

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?什麼查詢我可以用來獲得1結果whish是上述數據的ID?

+0

它看起來像你需要也拉ID。在你的情況下,它將從批處理組中選擇id,merchant_id,max(batch_no),由​​merchant_id' – kobaltz 2012-02-03 03:58:34

+0

什麼是ID與merchant_ID的關係?你可以發佈前5行左右的SELECT * FROM批處理嗎? – Aaron 2012-02-03 04:32:26

回答

1

此查詢的工作與PostgreSQL的任何版本,甚至在有窗函數(的PostgreSQL 8.3或更早):

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_nomerchant_id不應該是唯一的,你可以得到每多行merchant_id


隨着的PostgreSQL 8.4或更高版本使用window function first_value()

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) 

這甚至得到每MERCHANT_ID唯一行如果batch_no不應該是唯一的。在這種情況下,最小的id(對於merchant_id的最大batch_no)將被選中,因爲我另外按id對窗口進行排序。

這裏我使用DISTINCT,因爲它應用之後的窗口函數(而不是GROUP BY)。

+0

嗨erwin,thx爲您的答案..它的作品..但我想問一個關於「USING」功能的問題。什麼目的? – 2012-02-03 07:13:45

+1

@DiazPradiananto:'USING'是JOIN條件的簡寫符號。閱讀手冊[這裏](http://www.postgresql.org/docs/current/interactive/sql-select.html#SQL-FROM)。 – 2012-02-03 07:22:58

+0

thx erwin爲您提供幫助 – 2012-02-03 11:42:38