Rails удалить дубликаты, оставив самые новые записи

В бд есть записи результатов бегунов. Таблица Results имеет поля athlete_id (id спортсмена), created_at (дата/время создания записи), time (результат забега). У каждого бегуна может быть несколько записей результатов. Как сделать выборку результатов всех бегунов, чтобы в нее попали только последние созданные записи каждого бегуна?


Ответы (2 шт):

Автор решения: cauf

можно попробовать сделать через подзапрос. Например так:

select distinct 
    res1.athlete_id,
    (
        select top 1
            res2.time
        from
            Result as res2
        where
            res2.athlete_id = res1.athlete_id
        order by 
            res2.created_at 
    ) as last_time
from
    Results as res1;
→ Ссылка
Автор решения: Василиса

Если у вас PostgreSQL, то задачка легко решается через DISTINCT ON

Result.select('DISTINCT ON (athlete_id) *').order(created_at: :desc)

Из таблицы результатов будет взято по одной записи для каждого бегуна. Так как она отсортирована по created_at, то будет взята самая последняя по времени

→ Ссылка