【发布时间】:2013-09-03 15:12:42
【问题描述】:
我有一个模型 Laps,属于 :Car
所以每辆车都有很多圈,但我需要做一个查询,我在哪里拉入前 10 最快圈,但只拉入每辆车的最快圈。换句话说,我不希望一辆汽车被允许在列表中的前 10 圈中跑 5 圈。
每一圈都有一个 :car_id 字段。我想在此列上分组,然后从分组中拉出带有 min(Lap.time) 行的圈。 (也就是那个独特的 :car_id 的最快圈速)。
那么对于 Postgres,我最好的方法是什么?我可以先订购所有圈,然后分组,然后从组中拉出第一圈吗?还是分组不会保持排序顺序?
这是我的 Lap 模型架构:
create_table "laps", force: true do |t|
t.decimal "time"
t.string "video_url"
t.integer "car_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "user_id"
t.boolean "approved"
end
我必须为此使用两个组合查询吗?
我可以通过这样做获得一个独特的车牌圈数:
select('DISTINCT ON (car_id) *')
但是,我需要订购圈数,以便它获得每个 car_id 的 min(lap.time)。因此,当我发出这样的订单时:
select('DISTINCT ON (car_id) *').order('car_id, time ASC').sort_by! {|ts| ts.time}
这可行,但似乎是一种奇怪的方法。一旦我尝试更改订单,例如从订单中删除 car_id,我就会收到 postgres 错误。
【问题讨论】:
-
也许是这个?
Lap.select('min(laps.time), laps.*').group('laps.id, laps.car_id').limit(10) -
我刚试过这个。它给了我来自同一个 car_id 的多圈
-
这就是我所做的,它正在努力以最快的速度获得唯一的 car_id,但是当我调试对象时,它似乎没有按时间排序。如果有更好的方法来解决这些问题,请发布您的答案:select('DISTINCT ON (car_id) *').order('car_id, time ASC')
标签: sql ruby-on-rails ruby-on-rails-3 postgresql activerecord