Я бы использовал 1 столбец performance_time
из тип данных time
, чтобы заменить все:
performance_time_hours
performance_time_mins
performance_time_secs
performance_time_msecs
или interval
, если для одного выступления более 24 часоввозможно.
Я не очень хорошо разбираюсь в синтаксисе Ruby, но запрос, чтобы получить то, что вы хотите, может выглядеть следующим образом - при условии, что спортсмены могут выступать несколько раз за событие, а event_name
уникален:
SELECT athlete_id, min(performance_time) AS min_performance_time
FROM result
WHERE event_name = params[:justevent]
GROUP BY athlete_id
ORDER BY min(performance_time), athlete_id
Кроме того, я приказываю на athlete_id
, но это просто произвольная мера для стабильного разрыва связей.
DISTINCT
просто берет первую строку в соответствии спорядок сортировки для каждого набора дубликатов.Чтобы достичь того же результата с DISTINCT
, вам понадобится дополнительный выбор:
SELECT athlete_id, performance_time
FROM (
SELECT DISTINCT ON (athlete_id)
athlete_id, performance_time
FROM result
WHERE event_name = params[:justevent]
ORDER BY athlete_id, performance_time
) a
ORDER BY performance_time, athlete_id
Вам нужно ORDER BY athlete_id
, чтобы получить отдельных спортсменов, и вы не можете сначала сделать заказ как минимум на performance_time
на том же уровне запросов.Поэтому вам нужно поместить результат SELECT DISTINCT
в подвыбор и отсортировать по времени в дополнительном шаге.