PostgreSQL — Можно ли написать запрос PostgreSQL, который будет ограничивать количество возвращаемых результатов на основе определенных критериев?

#postgresql #jpa

Вопрос:

Я знаю, что формулировка моего заголовка расплывчата, поэтому я попытаюсь прояснить свой вопрос.

tasks_table

идентификатор пользователя дата завершения тип задачи идентификатор задачи
1 11/14/2021 A 34
1 11/13/2021 B 35
1 11/11/2021 A 36
1 11/09/2021 B 37
2 11/12/2021 A 38
2 11/02/2021 A 39
2 11/14/2021 B 40
2 10/14/2021 B 41

В таблице, с которой я работаю, больше полей, чем в этой, но это те, которые имеют отношение к вопросу. Тип задачи может быть либо A, либо B.

В настоящее время я пытаюсь получить набор результатов, содержащий максимум две задачи на идентификатор пользователя, одну из задач типа A и одну из задач типа B, которые были выполнены за последние 7 дней. Например, набор запросов должен генерировать следующий результирующий набор:

идентификатор пользователя дата завершения тип задачи идентификатор задачи
1 11/14/2021 A 34
1 11/13/2021 B 35
2 11/12/2021 A 38
2 11/14/2021 B 40

Существует вероятность того, что пользователь мог выполнять задачи только одного типа в течение этого периода времени, но гарантируется, что любой данный пользователь выполнит по крайней мере одну задачу в течение этого времени. Мой вопрос: возможно ли создать запрос, который может возвращать такой результат, или мне придется запросить более обобщенный результат, а затем сократить набор с помощью логики в моем JPA?

Ответ №1:

Чтобы выбрать самую последнюю задачу для данного идентификатора пользователя и типа задачи в течение последних 7 дней, если она существует, вы можете попробовать это :

 SELECT DISTINCT ON (t.user_id, t.task_type) t.*  FROM tasks_table AS t  WHERE t.completed_date gt;= current_date - interval '7 days'  ORDER BY t.user_id, t.task_type, t.completed_date DESC