我有一个通过向外部系统发送3个参数来请求信息的系统:user,start_date和end_date。
我有桌子
request (
id,
user,
start_date,
end_date,
status
)
记录这些请求及其状态(Done
对于已返回Waiting
的请求,尚未返回的请求)。
每隔几个小时,我将重新提交尚未返回的请求,即使初始请求将来仍会返回。
一段时间后,我的表将对同一个用户/开始日期/结束日期有多个请求,其中一些正在等待,一些已经完成。
我需要的是一个查询,该查询返回所有重复请求的ID列表,但1 Done除外,其中至少一个请求的status = Done。
总之,我需要一种清除给定用户/ start_date / end_date超出请求的方法,如果其中至少有一个具有status = Done(无论哪个,我只需要为给定用户保留1 status = Done) / start_date / end_date)。
到目前为止,我已经能够找出至少完成1次的重复请求。要从该查询中选择除一个完整查询之外的所有查询,我很可能会将整个查询包装成另外2个选择并进行魔术处理,但是按原样进行的查询已经非常缓慢。有人可以帮助我重构它并选择所需的最终结果吗?
http://sqlfiddle.com/#!5/10c25a/1
我正在使用SQLite
来自sqlfiddle中提供的数据集的预期结果是:
454, 457, 603, (604 or 605 not both), 607, 608
select r.id from request r inner join (
select user, start_date, end_date,
min(case when status = 'Done' then id end) as keep_id
from request
group by user, start_date, end_date
having count(case when status = 'Done' then 1 end) > 0 and count(*) > 1
) s on s.user = r.user and s.start_date = r.start_date and s.end_date = r.end_date
and s.keep_id <> r.id
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句