2015-09-28 74 views
1

我想從SQL Server 2012在這裏找到最近的重複記錄最近最重複的記錄是表結構我有。找到從SQL Server 2012

我有一個名爲放在userRegistration表名稱包含用戶ID(GUID)的副本,並在同一個表,我有CreatedDate列以及(日期)。現在我想從該表中找到最近的重複記錄。

這裏是相同的數據。

id FirstName LastName CreatedDate UserID 
109 FirstNameA LastNameA 28-04-2015 GUID1 
110 FirstNameC LastNameD 19-05-2015 GUID2 
111 FirstNameE LastNameF 22-05-2015 GUID1 

如果您對上面的表格注意到,GUID 1具有重複的,現在我想找到最近意味着它應該回到我的只有那些行與重疊,但最近的數據。所以在上面的表結構中,它應該返回111,因爲最近創建的記錄與109相比,我相信你明白了。

不要讓我知道如果你有任何問題。我很高興回答。謝謝。等待答覆。

Harshal

+0

當你從答案看,你的問題是有點曖昧。如果一個用戶名有三個匹配項,你想只顯示最新的記錄還是隻顯示第一個記錄以外的所有記錄? –

+0

@Harshal - 這裏提供的任何解決方案對你有幫助嗎? – Abhishek

回答

0

嘗試下面的查詢本應該做根據你的I/P數據的工作 -

create table #UserRegistration (id int,FirstName varchar(20),LastName varchar(20),CreatedDate date,UserID varchar(20)) 
insert into #UserRegistration 
select 109, 'FirstNameA', 'LastNameA', '2015-04-28', 'GUID1' union 
select 110, 'FirstNameC', 'LastNameD', '2015-05-19', 'GUID2' union 
select 111, 'FirstNameE', 'LastNameF', '2015-05-22', 'GUID1' 
select id, FirstName, LastName, CreatedDate, UserID from 
(SELECT ur.*,row_number() over(partition by UserID order by CreatedDate) rn 
FROM #UserRegistration ur) A 
where rn > 1 
0

你可以使用CTE。集團您的記錄由UserID,給你的特定行一個排名通過CreatedDate訂購。

insert into tab(id, FirstName, LastName, CreatedDate, UserID) 
values(109, 'FirstNameA', 'LastNameA', '2015-04-28', 'guid1'), 
     (110, 'FirstNameC', 'LastNameD', '2015-05-19', 'guid2'), 
     (111, 'FirstNameE', 'LastNameF', '2015-05-22', 'guid1'); 

with cte as 
(
    select id, ROW_NUMBER() over (partition by UserID order by CreatedDate asc) as [Rank], 
     FirstName, LastName, CreatedDate, UserID 
    from tab 
) 
select id, FirstName, LastName, CreatedDate, UserID from cte where Rank > 1 

Rank > 1條件負責檢索重複項目。

sqlfiddle鏈接: http://sqlfiddle.com/#!6/4d1f2/6

0

使用TMP-表解決了這個:

SELECT a.UserID, 
     MAX(a.CreatedDate) As CreatedDate 
INTO #latest 
FROM <your table> a 
GROUP BY a.UserID 
HAVING COUNT(a.UserID) > 1 

SELECT b.id 
FROM #latest a 
INNER JOIN <your table> b ON a.UserID = b.UserID AND a.CreatedDate = b.CreatedDate 
+0

感謝Tobyplz,我嘗試,但得到一個錯誤說 - 對a.CreatedDate無效的列名稱CreatedDate「,大多我試圖不運行它,它返回我總460條記錄,當我跑這個腳本,它返回我186分的記錄,這裏是查詢。 ---從用戶註冊組中選擇userId,COUNT(*)作爲具有COUNT(*)> 1的 –

+0

的用戶註冊組的更多值Wierd,我沒有任何問題。你確定列名拼寫正確嗎? – tobypls

+0

http://sqlfiddle.com/#!6/b7274/1 – tobypls

0

你會排名您記錄與ROW_NUMBER()給每個用戶ID 1#所有最後一個記錄。使用COUNT()時,請確保只獲取含有多條記錄的用戶標識。

select 
    id, firstname, lastname, createddate, userid 
from 
(
    select 
    id, firstname, lastname, createddate, userid, 
    row_number() over (partition by userid oder by createddate desc) as rn, 
    count(*) over (partition by userid) as cnt 
    from userregistration 
) ranked 
where rn = 1 -- only last one 
and cnt > 1; -- but only if there is more than one record for the userid 

這將獲取每個用戶標識具有重複項的最新記錄。

+0

感謝Thorsten。它工作真棒。 :)簡直太棒了! –

0

試試這個,

SELECT * FROM TableName tt WHERE 
exists(select MAX(createdDate) 
from TableName 
where tt.UserID = UserID 
group by UserID 
having MAX(createdDate)= tt.createdDate) 

我覺得你createddate字段不是日期字段,然後嘗試Format

0
WITH TempAns (id,UserID,duplicateRecordCount) 
    AS 
    (
     SELECT id, 
     UserID, 
     ROW_NUMBER()OVER(partition by UserID ORDER BY id) 
     AS duplicateRecordCount 
     FROM #t 
    ) 
    select * from #t where id in (
      select max(id) 
      from TempAns 
      where duplicateRecordCount > 1 
      group by name)