Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Select unique record with latest created date

| id    | user_id | created_at (datetime) |
| 1     | 1       | 17 May 2016 10:31:34  |
| 2     | 1       | 17 May 2016 12:41:54  |
| 3     | 2       | 18 May 2016 01:13:57  |
| 4     | 1       | 19 May 2016 07:21:24  |
| 5     | 2       | 20 May 2016 11:23:21  |
| 6     | 1       | 21 May 2016 03:41:29  |

How can I get the result of unique and latest created_at user_id record, which will be record id 5 and 6 in the above case?

What I have tried so far

So far I am trying to use group_by to return a hash like this:

Table.all.group_by(&:user_id)

#{1 => [record 1, record 2, record 4, record 6], etc}

And select the record with maximum date from it? Thanks.

Updated solution

Thanks to Gordon answer, I am using find_by_sql to use raw sql query in ror.

@table = Table.find_by_sql("Select distinct on (user_id) *
                            From tables
                            Order by user_id, created_at desc")

#To include eager loading with find_by_sql, we can add this

ActiveRecord::Associations::Preloader.new.preload(@table, :user)
like image 964
pyfl88 Avatar asked May 22 '16 01:05

pyfl88


People also ask

How do I get only the latest record by datetime in SQL?

If you are using ->latest()->get() then it will get records base on created_at, if we get records base on created_at then how about order by id desc both work as same. if you need by other column datetime then you can use ->orderBy('columnName','desc/asc')->get() otherwise you can use latest() function.


1 Answers

In Postrgres, you can use DISTINCT ON:

SELECT DISTINCT ON (user_id) *
FROM tables
ORDER BY user_id, created_at DESC;

I am not sure how to express this in ruby.

like image 129
Gordon Linoff Avatar answered Oct 06 '22 01:10

Gordon Linoff