2011-09-30 10 views
10

私はunit_id oid、time timestamp、diag byteaという単純なテーブルを持っています。主キーは、timeとunit_idの両方の組み合わせです。Postgresはすべての列を1つの列でグループ分けして選択します。

このクエリの背後にある考え方は、ユニークなunit_idごとに最新の行(最大のタイムスタンプ)を取得することです。ただし、最新の時刻を持つ各unit_idの行は必ずしも返されません。

私は本当にunit_idでグループ化したいと思っていますが、私はそれを選択しているので、postgresでdiagも使用しています。

SELECT DISTINCT ON(unit_id) max(time) as time, diag, unit_id 
FROM diagnostics.unit_diag_history 
GROUP BY unit_id, diag 

答えて

14

あなたはあなたBYローカライズGROUP約window functions代わりに考え始める必要がありたいと考え始める任意の時間。

select unit_id, time, diag 
from (
    select unit_id, time, diag, 
      rank() over (partition by unit_id order by time desc) as rank 
    from diagnostics.unit_diag_history 
) as dt 
where rank = 1 

あなたは一貫して、同様の関係を壊すためにORDER BYに何かを追加したい場合がありますが、それは全体的な手法を変更しません:

は、私はあなたがこのような何か後にしていると思います。

+0

サブセレクトを使用せずにこれを行うことはできますか? – metdos

+0

@metdos:私は頭の上から何も考えられませんが、方法があるかもしれません。派生テーブルの何が問題ですか? –

9

あなたは元のテーブルとグループ化の選択に参加することができます。

SELECT d.time, d.diag, d.unit_id 
FROM(
    SELECT unit_id, max(time) as max_time 
    FROM diagnostics.unit_diag_history 
    GROUP BY unit_id 
) s JOIN diagnostics.unit_diag_history d 
ON s.unit_id = d.unit_id AND s.max_time = d.time 
+0

これは私が何らかの形で(MySQLから来て)助けてくれた数日間のGoogle検索で見つかった唯一の答えです。 – Adrian

関連する問題