从SQL Server 2012中查找最近的重复记录

时间:2015-09-28 12:40:05

标签: sql-server

我想从SQL Server 2012中找到最近的重复记录。这是我的表结构。

我有名为UserRegistration的表名,其中包含UserID(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

6 个答案:

答案 0 :(得分: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

答案 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

答案 2 :(得分:0)

使用tmp-tables解决了这个问题:

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

答案 3 :(得分:0)

您使用echo '<textarea>'.htmlentities($xml).'</textarea>'; 对记录进行排名,以便为每个用户ID#1提供所有最后记录。使用ROW_NUMBER(),您只需确保用户ID具有多个记录。

COUNT()

这将获得每个具有重复项的用户标识的最新记录。

答案 4 :(得分: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

答案 5 :(得分: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 )