2016-09-15 20 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。
  3. phn_id應該是1322
  4. 上述兩個條件得到滿足後,我想檢查是否有任何日期列對於相同的用戶標識不相互匹配。 結果:在上面的示例中,由於date2和date3不匹配,因此期望輸出userId 4。

更新:我已更新樣本數據以供進一步說明。 我仍然期待結果userid 4作爲休息都不滿足條件。
說明: -
用戶標識3:日期匹配(我想爲不同的some_other_id設置不同的日期)。
userid 5:some_other_id是相同的。
userid 6:phn_id不同。

對不起,如果我讓你們混淆了這個問題。讓我知道是否需要其他細節。

+1

爲了澄清你的疑問,請根據表結構,該數據所需要的結果,一些示例數據發佈你的表結構,有什麼你到目前爲止嘗試過以及你的代碼存在的問題。在這裏,你可以在[問]和[mcve] – Aleksej

+0

上找到一些有用的信息,我已經發布了表格代碼片段。請運行代碼片段並檢查表結構和示例數據。 – Nitin

回答

0

您可以使用not exists子句並在其中編寫條件或某些分析函數來計算出現次數,然後對其進行過濾。樣品SQL與not exists

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 
+0

嗨,我不想比較userid和some_other_id,因爲你在這裏做的是「userid <> some_other_id」。我寧願採取一個用戶標識,並將它的some_other_id與對方進行比較。舉個例子:對於用戶標識4,我首先要檢查some_other_id(即23,23,如你所採取的)是否匹配。如果沒有,那麼只有我想檢查其他條件。 – Nitin

+0

非常感謝。您的查詢幫助了很多。 :) – Nitin

+0

只需要一點幫助。此查詢是否可以優化? 至於我這個查詢需要大約11-12分鐘執行。 – Nitin