我有一个访问表(人,visit_type,日期,...),我想按visit_type和人分组,然后选择每个组中具有MAX(date)的记录。我很确定使用查询代数而不是编写 SQL 应该很简单,但似乎无法让它工作。我以为它会是这样的:
Visit.group(:visit_type, :person).having("date = MAX(date)")
但这不会从每个组中选择单个记录。
编辑:啊!经过更多的调查 - 事实证明上述确实有效!耶!
编辑:啊!它适用于sqlite和mySql,但不适用于postgres,这与根据标准更严格地实现group_by函数有关。嘘,垃圾!这意味着我仍在寻找答案。
编辑:我不认为每次在sqlite上都会给出正确的结果。
好的,这是我目前要做的:
Visit.all.group_by{|v| [v.visit_type,v.person]}.map{|key, value| value.inject{|memo, visit| memo.date > visit.date ? memo : visit}}
我知道这并不漂亮,但这是我女儿的6岁生日,所以我必须去!
这行得通吗?
Visit.joins('LEFT JOIN visits v2 on visits.visit_type = v2.visit_type AND visits.person = v2.person AND visits.date > v2.date')