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 的最新信息的最佳方法是什么。

在 sqlite:SELECT "entries".* FROM "entries" GROUP BY uuid ORDER BY updated_at DESC中效果很好,但它在 postgres 中不是有效的语法,而且感觉有点笨拙。有没有一种好方法可以做到这一点,还是我需要重做我的架构?

4

1 回答 1

2

获得所需结果的一种方法是使用窗口函数和派生表。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()窗口函数的行为方式,以便针对匹配s 的row_number()行进行计算;同样仅适用于将要查看的uuid窗口。结果是剥离了每组中的第一行。order by created_at descrow_number()r = 1

于 2012-08-02T07:40:50.857 回答