2017-08-12 43 views
0

得到重複的記錄我有如下與結構表: Tabel Structure無法從表

爲user_id具有值在特定的時間間隔各自的項目。項目值可以是文本或整數取決於項目。

我想檢查是否有任何兩個或多個UserId爲相同的值,這意味着它們的項目在相同的值和相同的時間間隔內是相同的。

如上表所示UserId 213456和UserId 213458具有相同的記錄。 我試過使用遊標和循環,但它花費的時間太長。我的表有超過5000萬UserId。有沒有辦法以有效的方式做到這一點?

我也嘗試使用group by子查詢,但所有的嘗試都未能創建一個好的查詢。

我創建使用How do I find duplicate values in a table in Oracle?

select t1.USERID, count(t1.USERID) 
from USERS_ITEM_VAL t1 
where exists (select * 
       from USERS_ITEM_VAL t2 
       where t1.rowid <> t2.rowid and 
         t2.ITEMID = t1.ITEMID and 
         t2.TEXT_VALUE = t1.TEXT_VALUE and 
         --t2.INTEGER_VALUE = t1.INTEGER_VALUE and 
         t2.INIT_DATE = t1.INIT_DATE and 
         t2.FINAL_DATE = t1.FINAL_DATE) 
     group by t1.USERID having count(t1.USERID) > 1 order by count(t1.USERID); 

下面的查詢,但問題是它的工作不包括INTEGER_VALUE列,但不給我輸出的時候,當我包括在INTEGER_VALUE列的加入,雖然我在INTEGER_VALUE列數據是一樣的。 這裏是我的表的結構:接近這個利用自加入

USERID - NUMBER 
ITEMID - NUMBER 
TEXT_VALUE - VARCHAR2(500) 
INTEGER_VALUE - NUMBER 
INIT_DATE - DATE 
FINAL_DATE - DATE 
+0

https://stackoverflow.com/questions/59232/how-do-i-find-duplicate-values-in-a-table-in-oracle –

回答

0

的一種方式。這個想法是計算兩個用戶共同的項目數(考慮日期列)。然後比較這對項目的數量,每個有:

with t as (
     select t.*, count(*) over (partition by userid) as numitems 
     from t 
    ) 
select t1.userid, t2.userid 
from t t1 join 
    t t2 
    on t1.userid < t2.userid and 
     t1.itemid = t2.itemid and 
     t1.init_date = t2.init_date and 
     t1.final_date = t2.final_date and 
     t1.numitems = t2.numitems 
group by t1.userid, t2.userid, t1.numitems 
having count(*) = t1.numitems; 
+0

感謝您的幫助,但它沒有奏效 – John

0

查詢失敗的原因是,要麼TEXT_VALUE或integer_value將每一行中NULL。出於這個原因,不可能在自聯接中使用相等謂詞而不使用NVL函數來插入NULL值。

然而,下面是使用的解析函數來完成目標的查詢:

Select * From (
Select t.*, Count(*) Over (Partition By t.itemId, 
             t.text_value, 
             t.integer_value, 
             t.init_date, 
             t.final_date) as Cnt) 
Where cnt > 1; 

查詢返回在多個的記錄在Partition By條款的五列相同值的所有行。

這種技術優於自聯接方法的好處是該表只掃描一次,而使用自聯接進行兩次掃描。如果表格很大,這可能會帶來更好的性能。