@nakem

Как вернуть записи из каждой группы с минимальной датой создания?

Есть сущность project_id. Там могут быть task_id. Нужно в каждом project_id найти одну таску с минимальной датой создания и удовлетворяющая определенным условиям, которые можно опустить. Вот мой запрос:

SELECT a.id, a.name, a.status, b.project_id, b.created ...
FROM tasks a
JOIN (
    SELECT project_id, min(created) as created
    FROM tasks
    WHERE tasks.id = ANY (...)
    GROUP BY project_id
) b
ON a.project_id=b.project_id AND a.created = b.created;

Этот запрос прекрасно работает если не одно НО. Таски могут быть созданы в одно время. В таком случае вернется несколько тасков в одном project_id. Да, это можно пофиксить с помощью DISTINCT ON(created) - при дублировании поля created возвращать одно рандомное из дублей, но тогда есть вероятность вывода неправильного результата.
Нужно как-то задействовать id тасков.
  • Вопрос задан
  • 41 просмотр
Решения вопроса 1
@galaxy
возвращать одно рандомное из дублей, но тогда есть вероятность вывода неправильного результата

а в чем неправильность такого результата?

В любом случае, группировка и джойн тут избыточны:
SELECT DISTINCT ON (project_id) *
  FROM tasks
 WHERE tasks.id = ANY (...)
 ORDER BY project_id, created
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы