1

だから私はそのように設計されたテーブルを持っています:

create_table "entries", :force => true do |t|
  t.integer  "id", :null => false, :autoincrement => true
  t.text     "text"
  t.string   "uuid"
  t.datetime "created_at", :null => false
end

「データベース - 単一テーブルでのデータのバージョン管理」と同様の問題がありますが、複数のソース (オフラインで動作するものもある) がこのデータベースに書き込みを行っているため、このcurrentビットは実際にはうまく機能しません。

私が疑問に思っているのは、各 UUID の最新のものを取得する最良の方法は何かということです。

In sqlite:SELECT "entries".* FROM "entries" GROUP BY uuid ORDER BY updated_at DESCうまく機能しますが、postgres では有効な構文ではなく、ぎくしゃくした感じがします。これを行う良い方法はありますか、またはスキーマをやり直す必要がありますか?

4

1 に答える 1

2

目的の結果を得る1つの方法は、ウィンドウ関数と派生テーブルを使用することです。ActiveRecordはそれらのどちらも理解していませんが、常にありますfind_by_sql

Entry.find_by_sql(%q{
    select id, text, uuid, created_at
    from (
        select id, text, uuid, created_at,
               row_number() over (partition by uuid order by created_at desc) as r
        from entries
    ) as dt
    where r = 1
})

興味深い部分はこれです:

row_number() over (partition by uuid order by created_at desc)

partition by uuidに似てgroup by uuidいますが、行を折りたたむのではなく、row_number()ウィンドウ関数の動作を変更するだけで、 srow_number()が一致する行に関して計算されます。同様に、表示するウィンドウにのみ適用さuuidれます。その結果、各グループの最初の行がはがれます。order by created_at descrow_number()r = 1

于 2012-08-02T07:40:50.857 に答える