#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