如何只获得Rails中按某些值分组的最后记录

时间:2015-04-21 08:30:45

标签: ruby-on-rails postgresql activerecord

我有模型消息(id,text,sender_id,recipient_id,created_at)。 我只需要获取每个recipient_id范围内的最后记录。这就像大多数Messangers页面中的所有对话一样。

例如,我有这个(收件人是current_user):

id, sender_id, created_at
1, 1, 10.04.15
2, 1, 11.04.15
3, 2, 12.04.15
4, 3, 13.04.15
5, 2, 14.04.15

使用查询我只需要获取ID为2,4,5的值,按以下方式分组:

id, sender_id, created_at
2, 1, 11.04.15
4, 3, 13.04.15
5, 2, 14.04.15

通过此选择,我们拥有按用户分组的所有记录:

Message.order(created_at: :desc).group_by(:sender_id)    

2 个答案:

答案 0 :(得分:3)

您可以在每个步骤中细分以下内容以查看输出结果:

latest_ids = Message.group(:recipient_id).maximum(:id).values

使用获取的ID,您可能想要获取记录:

Message.where(id: latest_ids)

两个查询,是的,但这比替代方案更清晰,可能涉及自己编写一些SQL。

答案 1 :(得分:1)

您可以使用以下选择查询通过PostgreSQL获取所需的内容

SELECT id
    ,created_at
    ,recipient_id
FROM (
    SELECT id
        ,created_at
        ,recipient_id
        ,row_number() OVER (
            PARTITION BY recipient_id ORDER BY created_at DESC
            ) rn
    FROM dt
    ) t
WHERE rn = 1
ORDER BY id