2016-07-14 9 views
3

私はPostgreSQLデータベースを持っています。これはよくある問題のように思えますが、私のクエリを正しく取得できません。データベース内の各ユーザから最後のエントリを取得

私のテーブルには、次のようになります。

CREATE TABLE orders (
    account_id INTEGER, 
    order_id  INTEGER, 
    ts   TIMESTAMP DEFAULT NOW() 
) 

毎回、新しい秩序があり、私がリンクする、それを使用account_idorder_id

私の問題は、各アカウントの最後の注文(tsを見て)を持つリストを取得したいということです。例えば

私のデータがある場合、:

account_id order_id   ts 
     5   178  July 1 
     5   129  July 6 
     4   190  July 1 
     4   181  July 9 
     3   348  July 1 
     3   578  July 4 
     3   198  July 1 
     3   270  July 12 

それから私は、クエリは、各アカウントに対してのみ、最後の行を返すしたいと思います:

account_id order_id   ts 
     5   129  July 6 
     4   181  July 9 
     3   270  July 12 

私はGROUP BY account_idを試みた、と私はそれを使用して各アカウントのMAX(ts)を取得することができますが、その後は関連するorder_idを取得する方法がありません。私はサブクエリも試みましたが、私はそれを正しく理解することができません。

ありがとうございます!

+0

「LIMIT 1」と「ORDERBY ID DESC」を使用するために、いくつかの主キーが必要です。順序を逆にして1に制限します(したがって、最高のIDは最初の結果です。制限はこの1つの結果のみをとります)。 –

+0

ここをクリックしてください:http://stackoverflow.com/questions/331367/sql-statement-help-select-latest-order-for-each-customer –

+0

@Rajat私はただ一つの行が欲しくない、私は行が欲しいaccount_idごとに – gattoo

答えて

3
select distinct on (account_id) * 
from orders 
order by account_id, ts desc 

https://www.postgresql.org/docs/current/static/sql-select.html#SQL-DISTINCT

DISTINCT ON(式[、...])を選択の各セットの最初の行のみを保持与えられた式が等しいと評価される行。 DISTINCT ON式は、ORDER BY(上記参照)と同じ規則を使用して解釈されます。各セットの「最初の行」は、ORDER BYを使用して目的の行が最初に表示されない限り、予測できないことに注意してください。

+0

優秀!よく働く!ありがとう! 以前はDISTINCTを使用していましたが、ONキーワードについてはわかりませんでした。 – gattoo

+1

ちょうど注記:明らかに 'DISTINCT ON(expression)'はPostgreSQLのことです。標準SQLではありません。私はPostgreSQLを使用しているので、まだ最高の答えです。 – gattoo

2

row_number()窓関数は、助けることができる:

select account_id, order_id, ts 
    from (select account_id, order_id, ts, 
       row_number() over(partition by account_id order by ts desc) as rn 
      from tbl) t 
where rn = 1 
関連する問題