2012-09-21 19 views
1

我有一個訪問表(person,visit_type,date,...),我想通過visit_type和person進行分組,然後選擇每個組中具有MAX(日期)的記錄。我敢肯定它應該是簡單的使用查詢代數而不是編寫SQL,但似乎無法讓它工作。我認爲它會是這樣的:rails activerecord arel group_by something,併爲每個組選擇最大(col)記錄

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

但是,這並不選擇每組的單條記錄。

編輯:啊!經過多一點調查 - 事實證明上述確實有效!好極了!

編輯:啊!它適用於sqlite和mySql,但不適用於postgres,這與根據標準更嚴格地實施group_by函數有關。噓,垃圾!這意味着我仍然在尋找答案。

編輯:我不認爲這會給每次在sqlite上的正確結果。

+0

不知道如何標記爲正確的,也許我應該刪除?建議... – jjnevis

+0

這是一個很好的問題/答案,我會離開它。我從中學到了一些東西:) – iouri

+0

請參閱編輯 - 不工作postgres,我得到的錯誤討論[這裏](http://stackoverflow.com/questions/1062158/converting-mysql-select-to-postgresql)。仍在尋找優雅的解決方案。 – jjnevis

回答

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歲生日,所以我得走了!

0

這項工作?

Visit.joins('LEFT JOIN visits v2 on visits.visit_type = v2.visit_type AND visits.person = v2.person AND visits.date > v2.date') 
+0

沒有 - 獲取重複,但我有一個使用ruby的解決方案,即使它有點可怕。 – jjnevis