1

我有一张访问表(人员,访问类型,日期,...),我想按访问类型和人员分组,然后选择每个组中具有 MAX(日期)的记录。我很确定使用查询代数而不是编写 SQL 应该很简单,但似乎无法让它工作。我认为它会是这样的:

Visit.group(:visit_type, :person).having("date = MAX(date)")

但这不会从每个组中选择单个记录。

编辑:啊!经过更多调查 - 事实证明上述方法确实有效!耶!

编辑:啊!它适用于 sqlite 和 mySql,但不适用于 postgres,这与根据标准更严格地实现 group_by 函数有关。嘘,垃圾!这意味着我仍在寻找答案。

编辑:我不认为这每次在 sqlite 上都能给出正确的结果。

4

2 回答 2

1

好的,这就是我现在要做的事情:

Visit.all.group_by{|v| [v.visit_type,v.person]}.map{|key, value| value.inject{|memo, visit| memo.date > visit.date ? memo : visit}}

我知道这不漂亮,但这是我女儿的六岁生日,所以我得走了!

于 2012-09-21T17:55:49.960 回答
0

这行得通吗?

Visit.joins('LEFT JOIN visits v2 on visits.visit_type = v2.visit_type AND visits.person = v2.person AND visits.date > v2.date')
于 2012-09-21T16:06:47.813 回答