2015-08-26 48 views
2

我需要找到重複的記錄(與主記錄ID,並重復記錄ID):如何選擇row_number和統計分區?

select ciid, name from (
select ciid, name, row_number() over (
    partition by related_id, name order by updatedate desc) rn 
) where rn = 1; 

這使我的主記錄ID,但它也包括記錄沒有重複。

如果我使用

​​

這讓我所有的重複記錄,但不是主記錄。

我希望如果我做這樣的事情:

select ciid, name from (
select ciid, name, row_number() over (
    partition by related_id, name order by updatedate desc 
) rn, count(*) over (
    partition by related_id, name order by updatedate desc 
) cnt 
) where rn = 1 and cnt > 1; 

但我擔心的表現,甚至是它實際上做我想要什麼。

如何獲取只有重複記錄的主記錄?請注意,name不是唯一的列。只有ciid是唯一的。

回答

0

我沒有測試過這一點(因爲我沒有真實的數據和懶得創造一些),但似乎這些方針的東西可能的工作:

with has_duplicates as (
    select related_id, name 
    from yourtable 
    group by related_id, name 
    having count (*) > 1 
), 
with_dupes as (
    select 
    y.ccid, y.name, 
    row_number() over (partition by y.related_id, y.name order by y.updatedate desc) rn 
    from 
    yourtable y, 
    has_duplicates d 
    where 
    y.related_id = d.related_id and 
    y.name = d.name 
) 
select 
    ccid, name 
from with_dupes 
where rn = 1 
1
select ciid, name 
from (
select ciid, name, 
dense_rank() over (partition by related_id, name order by updatedate desc) rn 
from tablename) t 
group by ciid,name 
having count(distinct rn) > 1; 

編輯:爲了找到重複,爲什麼不這樣做。

select x.ciid, x.name, x.updatedate 
from tablename x join 
(
select name, related_id, max(updatedate) as mxdt, count(*) 
from tablename 
group by name, related_id 
having count(*) > 1 
) t 
on x.updatedate = t.mxdt and x.name = t.name 

你可以做一個group byhaving選擇具有多個行具有相同的行數只有那些ID的。

+0

它不會返回任何內容......'distinct rn'工作嗎?似乎rn對於分區中的每一行都是不同的。 – texasbruce

+0

按CIID分組將不會成功... CIID是唯一的... – texasbruce

+0

編輯的部分不起作用嗎?只是爲了找到重複? –

6

我結束了使用類似在我的問題中查詢:

select ciid, name from (
select ciid, name, row_number() over (
    partition by related_id, name order by updatedate desc 
) rn, count(*) over (
    partition by related_id, name desc 
) cnt 
) where rn = 1 and cnt > 1; 

工程出人意料的好。主記錄是rn = 1,重複記錄是rn> 1.確保count(*) over (partition ..)不能有order by子句。

+0

實際上,這是正確的解決方案。我的解決方案對錶格執行兩次掃描,而您只需一次掃描即可完成。現在我明白了,我希望我自己想出了這個 – Hambone

+0

@Hambone謝謝..但無論如何只要給點意見 – texasbruce

+0

@texasbruce真棒答案,不知道你可以用count over – VorobeY1326