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}}

かわいくないのはわかってるけど、娘の6歳の誕生日だから行かなきゃ!

于 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 に答える