如何解决根据多个真实条件查询所有相同的ID
我有这张桌子:
id act st_dt end_dt stats
1 a 01/01/20 05/01/20 done
1 b 04/01/20 09/02/20 done
1 c 09/02/20 null not done
1 d 09/02/20 09/02/20 done
2 a 09/03/19 14/05/20 done
2 b 09/02/20 25/06/20 done
2 c 01/03/20 22/03/20 done
2 d 09/02/20 null not done
3 a 11/05/20 13/09/19 done
3 b 09/02/20 04/07/20 done
3 c 01/02/20 30/02/20 done
3 d 11/02/20 24/02/20 done
我要查询具有活动a> = 01/01/20且活动d状态已完成的同一ID的所有活动“行为”, 因此结果应如下所示:
id act st_dt end_dt stats
1 a 01/01/20 05/01/20 done
1 b 04/01/20 09/02/20 done
1 c 09/02/20 null not done
1 d 09/02/20 09/02/20 done
此ID满足两个条件,我这样做了:
select * from
(
select
a.*,case when (act = 'a' and end_dt > to_date('01/01/20','dd/mm/yy')) and (act = 'd' and status = 'done') then 1 end) flag
from
table a
)
where flag = 1;
但它不会执行必需的操作,只会查询活动“ a”和“ d”
解决方法
您可以使用exists
:
select a.*
from a
where exists (select 1
from a a2
where a2.id = a.id and a2.act = 'a' and a2.st_dt <= date '2020-01-01'
) and
exists (select 1
from a a2
where a2.id = a.id and a2.act = 'd' and a2.stats = 'done'
) ;
,
如果您想学习新知识:
创建表格:
USRegion
这是适用于12c及更高版本的解决方案
create table tab as
with t (id,act,start_date,end_date,status) as
(
select 1,'a',to_date('01/01/2020','dd/mm/yyyy'),to_date('05/01/2020','done' from dual union all
select 1,'b',to_date('04/01/2020',to_date('09/02/2020','done' from dual union all
select 1,'c',null,'not done' from dual union all
select 1,'d','done' from dual union all
select 2,to_date('09/03/2019',to_date('14/05/2020','done' from dual union all
select 2,to_date('25/06/2020',to_date('01/03/2020',to_date('22/03/2020','not done' from dual union all
select 3,to_date('11/05/2020',to_date('13/09/2019','done' from dual union all
select 3,to_date('04/07/2020','done' from dual union all
select 3,to_date('01/02/2020',to_date('29/02/2020','done' from dual union all --End_date is wrong in your input data I changed it to 29
select 3,to_date('11/02/2020',to_date('24/02/2020','done' from dual
)
select * from t
,
首先进入两个子查询,分别是开工和做得好的作业的ID
。
INTERSECT
的结果可以同时获得两个条件的工作,并使用ID
谓词中的IN
集
查询
select *
from tab a
where id in (
select id
from tab a
where (act = 'a' and st_dt >= to_date('01/01/20','dd/mm/yy'))
INTERSECT
select id
from tab a
where (act = 'd' and stats = 'done')
)
,
一种选择是通过分析函数使用汇总条件,以确定是否同时满足两个条件:
WITH a2 AS
(
SELECT a.*,SUM(CASE WHEN act = 'a' AND end_dt >= date'2020-01-01'
THEN 1
ELSE 0
END)
OVER(PARTITION BY id) *
SUM(CASE WHEN act = 'd' AND stats = 'done'
THEN 1
ELSE 0
END)
OVER(PARTITION BY id) AS satisfies
FROM a
)
SELECT id,st_dt,end_dt,stats
FROM a2
WHERE satisfies = 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。