PostgreSQL如何编写按指定条件限流结果的查询:按用户分组最多返回最近7天两类任务各1条
解答
你完全可以直接通过PostgreSQL查询实现该需求,不需要额外通过JPA做业务逻辑裁剪,借助PostgreSQL内置的窗口函数即可高效完成。
实现思路
- 先过滤出过去7天内完成的所有任务记录
- 以
user_id+task_type为分组维度,对同组内的任务按完成时间倒序排名 - 取每个分组内排名第一的记录,就是对应任务类型下用户最新完成的任务
参考查询语句
WITH ranked_tasks AS ( SELECT user_id, completed_date, task_type, task_id, ROW_NUMBER() OVER ( PARTITION BY user_id, task_type ORDER BY TO_DATE(completed_date, 'MM/DD/YYYY') DESC ) AS rank_num FROM tasks_table WHERE TO_DATE(completed_date, 'MM/DD/YYYY') >= CURRENT_DATE - INTERVAL '7 days' ) SELECT user_id, completed_date, task_type, task_id FROM ranked_tasks WHERE rank_num = 1 ORDER BY user_id, task_type;
补充说明
- 如果你的
completed_date字段本身就是DATE/TIMESTAMP类型,不需要加TO_DATE转换,直接用字段本身做排序和时间过滤即可 - 该查询自动适配仅完成单一类型任务的用户,只会返回该用户存在的任务类型对应的最新记录,符合你提到的边界场景
- 若要进一步优化性能,可以给
(user_id, task_type, completed_date DESC)创建联合索引
内容的提问来源于stack exchange,提问作者Aarth Thakore
相关产品推荐
相关产品推荐

