2016-06-27 5 views
0

後行の選択:私は次のような構造を持っているPostgresのDB内のテーブルを持っているpostgresの中に複数のグループ

id | date | groupme1 | groupme2 | value 
---------------------------------------- 
1 | 
2 | 
3 | 

今、私は次のことを達成したい:

後にテーブルをグループ化
  1. groupme1とgroupme2
  2. 各グループの値を取得
  3. ただし、各グループの最後のエントリ(日付以降)

例:

id | date | groupme1 | groupme2 | value 
--------------------------------------- 
    |  |  A |  1 | 4 
    |  |  A |  2 | 7 
    |  |  A |  3 | 3 
    |  |  B |  1 | 9 

私の現在のアプローチは次のようになります。このアプローチの

SELECT a.* 
FROM table AS a 
JOIN (SELECT max(id) AS id 
     FROM table 
     GROUP BY groupme1, groupme2) AS b 
ON a.id = b.id 

問題:

  • それは高い日付が高いID
  • を持っていることをasumes
  • 長くかかります

これを行う方法がより速く、より良い方法はありますか?これでウィンドウ関数が助けますか?

答えて

0

私はあなただけでウィンドウ関数をしたいと思う:Postgresの中でこれを行うには良い方法はdistinct onを使用して、

select t.* 
from (select t.*, 
      row_number() over (partition by groupme1, groupme2 order by date desc) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

または:

select distinct on (groupme1, groupme2) t.* 
from t 
order by groupme1, groupme2, date desc; 
+0

どちらのソリューションが動作します。これは最速の方法ですか? 7000行のデータベースからdatepanに2番目のものを実行するには4.8秒かかります。 – Xlaech

+0

2番目のバージョンがおそらく最も速く、 't(groupme1、groupme2、date desc)'のインデックスは速くなります。 –

関連する問題