通常の ActiveRecord インターフェイスでは確実にこれを行うことはできませんが、ウィンドウ関数を使用して SQL を通じて行うことができます。次のような SQL が必要です。
select id, user_id, group_id, created_at
from (
select id, user_id, group_id, created_at,
row_number() over (partition by group_id order by created_at desc, id desc) as r
from user_pulses
where user_id = :user_id
) dt
where r = 1
そしてそれをラップしfind_by_sql
ます:
pulses = UserPulses.find_by_sql([%q{
select id, user_id, group_id, created_at
from (
select id, user_id, group_id, created_at,
row_number() over (partition by group_id order by created_at desc, id desc) as r
from user_pulses
where user_id = :user_id
) dt
where r = 1
}, :user_id => user.id])
ウィンドウ関数部分は基本的に、各 でローカルの GROUP BY を実行しgroup_id
、それらを並べ替え ( id desc
「念のため」のタイ ブレーカーとして 2 番目の並べ替えキーとして)、グループごとの行番号を に追加しr
ます。次に、外側のクエリは、各グループ ( where r = 1
) and peels off the original
user_pulses` 列の最初の列を除外します。