(SQL)我想从给定的表中输出特定的行

时间:2016-09-15 07:46:57

标签: sql oracle

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 

我想要的是什么:

  1. 我想要所有用户ID /行
  2. some_user_id与同一用户ID不匹配。
  3. phn_id应该是1322
  4. 在满足上述两个条件后,我想检查相同的用户ID是否有任何日期列彼此不匹配。 结果:在上面的示例中,我期望userId 4的输出为date2和date3不匹配。
  5. 更新:我已更新样本数据以进一步说明。 我仍然期待结果用户ID 4作为休息都不满足条件 说明: -
    用户ID 3:日期匹配。(我希望不同的some_other_id有不同的日期) 用户标识5:some_other_id相同。
    用户ID 6:phn_id不同。

    对不起,如果我让你们对这个问题感到困惑。如果需要任何其他细节,请告诉我。

1 个答案:

答案 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