Userid some_other_id phn_id date1 date2 date3 date4
3 21 1322 09-DEC-15 31-DEC-99 01-JAN-00 31/12/9999
3 22 1322 09-DEC-15 31-DEC-99 01-JAN-00 31/12/9999
4 23 1322 21-AUG-15 25-AUG-06 01-OCT-03 31/12/9999
4 24 1322 21-AUG-15 31-DEC-99 25-AUG-06 31/12/9999
5 22 1322 09-DEC-15 31-DEC-99 01-JAN-00 31/12/9999
5 22 1322 01-OCT-03 25-AUG-06 01-JAN-00 31/12/9999
6 23 1321 21-AUG-15 25-AUG-06 01-OCT-03 31/12/9999
6 24 1322 21-AUG-15 31-DEC-99 25-AUG-06 31/12/9999
我想要的是什么:
更新:我已更新样本数据以进一步说明。
我仍然期待结果用户ID 4作为休息都不满足条件
说明: -
用户ID 3:日期匹配。(我希望不同的some_other_id有不同的日期)
用户标识5:some_other_id相同。
用户ID 6:phn_id不同。
对不起,如果我让你们对这个问题感到困惑。如果需要任何其他细节,请告诉我。
答案 0 :(得分:0)
您可以使用not exists
子句并在那里编写您的标准或一些分析函数来计算出现次数,然后对其进行过滤。使用not exists
示例SQL:
select t1.*
from t t1
where userid <> some_other_id and phn_id = 1322
and not exists (select 1 from t t2
where t1.rowid <> t2.rowid and t1.userid = t2.userid
and t1.date1 = t2.date1 and t1.date2 = t2.date2
and t1.date3 = t2.date3 and t1.date4 = t2.date4 )
修改:在您进一步澄清之后,上面的旧查询不起作用,我的想法是:
select *
from (
select t.*,
count(1) over (partition by userid) cnt_phn,
count(distinct some_other_id) over (partition by userid) cnt_id,
count(1) over (partition by userid, date1, date2, date3, date4) cnt_dt
from t where phn_id = 1322 )
where cnt_phn > 1 and cnt_id > 1 and cnt_dt = 1
order by userid, some_other_id
如果您只运行内部查询,则可以看到,对于每个user_id:cnt_phn
个号码为1322的电话号码cnt_id
- 此用户的不同some_other_id号码和cnt_dt
- 计算每个元组的日期。
外部查询根据您的条件过滤数据。使用更新的示例数据,它只显示用户4,如预期的那样。如果您发现任何问题,可能需要调整此查询,但此处您有两种方法可以实现目标:exist
和分析函数。希望这会有所帮助。
测试数据:
create table t (Userid number(3), some_other_id number(3), phn_id number(6), date1 date, date2 date, date3 date, date4 date);
insert into t values (3, 21, 1322, date '2015-12-09', date '1999-12-31', date '2000-01-01', date '9999-12-31');
insert into t values (3, 22, 1322, date '2015-12-09', date '1999-12-31', date '2000-01-01', date '9999-12-31');
insert into t values (4, 23, 1322, date '2015-08-21', date '2006-08-25', date '2003-10-01', date '9999-12-31');
insert into t values (4, 24, 1322, date '2015-08-21', date '1999-12-31', date '2006-08-25', date '9999-12-31');
insert into t values (5, 22, 1322, date '2015-12-09', date '1999-12-31', date '2000-01-01', date '9999-12-31');
insert into t values (5, 22, 1322, date '2003-10-01', date '2006-08-25', date '2000-01-01', date '9999-12-31');
insert into t values (6, 23, 1321, date '2015-08-21', date '2006-08-25', date '2003-10-01', date '9999-12-31');
insert into t values (6, 24, 1322, date '2015-08-21', date '2015-12-31', date '2006-08-25', date '9999-12-31');
输出:
USERID SOME_OTHER_ID PHN_ID DATE1 DATE2 DATE3 DATE4
------ ------------- ------- ----------- ----------- ----------- -----------
4 23 1322 2015-08-21 2006-08-25 2003-10-01 9999-12-31
4 23 1322 2015-08-21 1999-12-31 2006-08-25 9999-12-31