2016-09-15 21 views
-1
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 

から特定の行の出力をしたい:(SQL)私は私が欲しいもの与えられたテーブル

  1. 私は
  2. some_user_idは、同じユーザーIDのために一致しないすべてのユーザーID /行をしたいです。
  3. phn_idは1322
  4. です。上記の2つの条件が満たされたら、同じユーザーIDに対して日付列が一致していないかどうかを確認したいと思います。 結果:上記の例では、date2とdate3が一致しないため、userId 4の出力を期待しています。

更新:サンプルデータを更新して、さらに明確にしました。 私は残りのすべてが条件を満たしていないので、結果userid 4を期待しています。
説明: -
ユーザーID 3:日付が一致しています(別のsome_other_idに異なる日付が必要です)。
Userid 5:some_other_idは同じです。
ユーザID 6:phn_idが異なっています。

申し訳ありませんが、私はあなたが質問に混乱してしまった場合。他の詳細が必要な場合はお知らせください。

+1

あなたが疑問明確にするために、いくつかのサンプルデータは、テーブル構造、そのデータのために必要な結果に応じて、あなたのテーブル構造を投稿してください、何これまでのところ、あなたのコードで問題が発生しました。ここであなたは[ask]と[mcve]に役立つものを見つけました – Aleksej

+0

私はすでにテーブルコードスニペットを掲示しています。コードスニペットを実行して、テーブル構造とサンプルデータを確認してください。 – Nitin

答えて

0

句を使用して、そこに条件を書き込んだり、発生をカウントしてフィルタリングしたりすることができます。 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のみが表示されます。問題が見つかった場合、このクエリに調整が必要な場合がありますが、目標を達成するには2通りの方法があります。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 
+0

こんにちは、ここであなたが "userid <> some_other_id"のようにuseridとsome_other_idを比較したくありません。むしろ1つのユーザーIDをとり、そのsome_other_idをお互いに比較したいと思っています。例:userid 4の場合は、まずsome_other_id(つまり、23,23を取得したかどうか)が一致しているかどうかを確認します。そうでなければ、他の条件をチェックしたいだけです。 – Nitin

+0

ありがとうございました。あなたの質問はとても助けになりました。 :) – Nitin

+0

ほんの少しの助けが必要でした。このクエリを最適化できますか? 私の場合、このクエリは約11〜12分かかることがあります。 – Nitin

関連する問題