我想从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
答案 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 )