SQL查询需求:获取满足状态与ASSIGNED动作条件的task全量数据
获取指定分配人的PROCESSING状态任务
针对你的需求,我整理了两种实用的SQL查询方案,你可以根据自己使用的数据库(比如MySQL、PostgreSQL、SQL Server等)来选择合适的写法:
方案一:使用窗口函数(推荐,简洁高效)
这种方法利用窗口函数ROW_NUMBER()给每个任务的ASSIGNED动作按时间倒序编号,取最新的那条(编号为1),再关联任务表筛选状态和指定邮箱:
SELECT t.* FROM task t JOIN ( SELECT task_id, action_details, ROW_NUMBER() OVER (PARTITION BY task_id ORDER BY action_datetime DESC) AS rn FROM task_action WHERE action_type = 'ASSIGNED' ) ta ON t.task_id = ta.task_id AND ta.rn = 1 WHERE t.status = 'PROCESSING' AND JSON_EXTRACT(ta.action_details, '$.assigned_to') = 'target_email@example.com';
说明:
ROW_NUMBER() OVER (PARTITION BY task_id ORDER BY action_datetime DESC):按任务ID分组,每组内按动作时间倒序给记录编号,最新的动作编号为1JSON_EXTRACT(...):根据数据库的JSON函数语法调整,比如MySQL用JSON_EXTRACT,PostgreSQL可以用action_details ->> 'assigned_to',SQL Server用JSON_VALUE(ta.action_details, '$.assigned_to')- 替换
'target_email@example.com'为你要匹配的目标邮箱
方案二:使用子查询获取最新动作时间
如果你的数据库不支持窗口函数,可以用这种方式,先找到每个任务的最新ASSIGNED动作时间,再关联筛选:
SELECT t.* FROM task t JOIN task_action ta ON t.task_id = ta.task_id WHERE t.status = 'PROCESSING' AND ta.action_type = 'ASSIGNED' AND ta.action_datetime = ( SELECT MAX(action_datetime) FROM task_action WHERE task_id = t.task_id AND action_type = 'ASSIGNED' ) AND JSON_EXTRACT(ta.action_details, '$.assigned_to') = 'target_email@example.com';
说明:
- 子查询
(SELECT MAX(action_datetime) ...)用于获取当前任务的最新ASSIGNED动作时间 - 同样注意JSON函数的语法要适配你的数据库类型
内容的提问来源于stack exchange,提问作者sachsure
相关产品推荐
相关产品推荐

