首页 > 解决方案 > PostgreSQL - 是否可以编写一个 PostgreSQL 查询来限制它根据特定条件返回的结果数量?

问题描述

我知道我的标题措辞含糊不清,所以我会尝试澄清我的问题。

任务表

用户身份 完成日期 任务类型 task_id
1 2021 年 11 月 14 日 一种 34
1 2021 年 11 月 13 日 35
1 2021 年 11 月 11 日 一种 36
1 2021 年 11 月 9 日 37
2 2021 年 11 月 12 日 一种 38
2 2021 年 11 月 2 日 一种 39
2 2021 年 11 月 14 日 40
2 2021 年 10 月 14 日 41

我正在使用的表有比这更多的字段,但是,这些是与问题相关的字段。任务类型可以是 A 或 B。

我目前正在尝试做的是获得一个结果集,其中每个 user_id 最多包含两个任务,一个任务类型 A 和一个任务类型 B,在过去 7 天内已完成。例如,查询的集合应生成以下结果集:

用户身份 完成日期 任务类型 task_id
1 2021 年 11 月 14 日 一种 34
1 2021 年 11 月 13 日 35
2 2021 年 11 月 12 日 一种 38
2 2021 年 11 月 14 日 40

用户可能在该时间段内只完成了一种类型的任务,但可以保证任何给定用户在该时间段内至少完成了一项任务。我的问题是可以创建一个可以返回这样一个结果的查询,还是我必须查询一个更通用的结果,然后通过我的 JPA 中的逻辑修剪集合?

标签: postgresqljpa

解决方案


要选择从现在起过去 7 天内给定 user_id 和 task_type 的最新任务(如果存在),您可以尝试以下操作:

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

推荐阅读