表
Actions
----------
action_id
Tasks
---------
task_id
action_id
status_id (can be: 1=waiting, 2=processing, 3=failed)
dt_created
我正在尝试编写一个返回所有“操作”的查询:
如果在过去24小时内创建了任务,所有都有“状态”失败
我的困难在于确保在过去的24小时内没有创建任何未失败的任务。
因此,简单查询失败,因为它只会返回与两者匹配的结果。
select ....
WHERE tasks.dt_created > tasks.dt_created > now () - interval '1 day' AND
tasks.status_id=3
我确定这是一个简单的查询,但我必须使用错误的术语进行搜索,因为我找不到任何内容
答案 0 :(得分:1)
select action_id
from
actions
inner join
tasks using(action_id)
where tasks.dt_created > now () - interval '1 day'
group by action_id
having bool_and(status_id = 3)
bool_and
将评估为
如果所有输入值都为true,则为true,否则为false
http://www.postgresql.org/docs/current/static/functions-aggregate.html
使用bool_or
的此版本可能会稍快一些
select action_id
from
actions
inner join
tasks using(action_id)
where tasks.dt_created > now () - interval '1 day'
group by action_id
having not bool_or(status_id <> 3)
答案 1 :(得分:0)
如果我理解逻辑正确,您希望所有行动都超过一天。然后,您需要所有任务都失败的新操作。以下查询实现了此逻辑:
select action_id
from tasks t
group by action_id
having sum(case when t.dt_created < now () - interval '1 day' then 1 else 0 end) > 0 or
sum(case when status_id <> 3 then 1 else 0 end) = 0;
但是,您可能需要以下内容:在过去24小时内完成任务且未失败的所有操作:
select action_id
from tasks t
where t.dt_created >= now () - interval '1 day'
group by action_id
having sum(case when status_id <> 3 then 1 else 0 end) = 0;