我有两个不同的查询,第一个会给我每天有呼出的用户数,第二个会给我每天有呼入的用户数。我想要这两个查询的统一。我的意思是,我想每天有呼入或呼出的用户数量。对于这样的结果,正确的查询是什么?
1) select call_date, count(*)
from
(select distinct anum,call_date
from CDR
where anum in (select msisdn from degree_cmp_week1)
)
group by call_date
order by call_date;
2) select call_date, count(*)
from
(select distinct bnum,call_date
from CDR
where bnum in (select msisdn from degree_cmp_week1)
)
group by call_date
order by call_date;
FYI CDR是呼叫详细信息记录表。它包括anum (呼叫源)、bnum (呼叫目的地)和呼叫日期。我正在寻找计算的人数,有任何类型的活动(打电话给某人或某人打电话给他/她)每天。第一个查询将为我提供作为呼叫源的人数,第二个查询将为我提供作为呼叫目的地的人数。假设第一个查询给我n(A),第二个查询给我n(B)。我正在寻找n(A和B)。如你所知,n(A,U,B)= n(A )+n( B) - n(A交集B)。所以找到n(A交叉点B)也会对我有帮助。
附言:我使用oracle 11,所以请考虑一下。
发布于 2014-07-14 21:43:21
只需在查询中询问入站和出站呼叫:
select call_date, count(num)
from
(select distinct anum as num, call_date
from CDR
where anum in (select msisdn from degree_cmp_week1)
)
union
(select distinct bnum as num ,call_date
from CDR
where bnum in (select msisdn from degree_cmp_week1)
)
group by call_date
order by call_date;
发布于 2014-07-14 21:55:08
下面这样的代码可以在一个查询中同时提供这两个结果:
with ids as (
select distinct msisdn
from degree_cmp_week1
), calls as (
select
call_date,
nvl2 (i1.msisdn, 1, 0) as a_count,
nvl2 (i2.msisdn, 1, 0) as b_count
from
CDR,
ids i1,
ids i2
where
CDR.anum = i1.msisdn (+) and
CDR.bnum = i2.msisdn (+)
)
select
call_date, sum (a_count) as a_count,
sum (b_count) as b_count
from calls
group by call_date
order by call_date
https://stackoverflow.com/questions/24737848
复制相似问题