Обновленный ответ после комментария @ Engineeringmnky (спасибо, пропустил группировку).
Чтобы удалить дубликаты, вам необходимо получить идентификаторы дубликатов строк. Для каждого дубликата вам понадобится N - 1 идентификаторов, так как один должен быть оставлен позади.
Чтобы получить все идентификаторы для каждой группы, которая имеет более одного (и, следовательно, имеет дубликаты):
SELECT array_agg(id) FROM log_entries GROUP BY date, athlete_id HAVING count(*) > 1
Давайте пропустим первый идентификатор в каждой группе:
SELECT (array_agg(id))[2:] FROM log_entries GROUP BY date, athlete_id HAVING count(*) > 1
Далее нам нужно их откатить, чтобы получить список только тех идентификаторов, которые мы хотим удалить:
SELECT unnest((array_agg(id))[2:]) FROM log_entries GROUP BY date, athlete_id HAVING count(*) > 1
Теперь, чтобы загрузить их в Rails, достаточно простого .where(..)
, если идентификатор находится в созданном выше наборе результатов:
LogEntry.where('id IN (SELECT unnest((array_agg(id))[2:]) FROM log_entries GROUP BY date, athlete_id HAVING count(*) > 1)')
Оригинальный ответ:
Ваш SELECT
не выбирает id
. Добавьте id
к вашему запросу, и оно должно работать:
LogEntry.find_by_sql("SELECT id, date, athlete_id, count(*) as qty FROM log_entries GROUP BY date, athlete_id HAVING count(*)> 1")