如何从单个 table 中获取重复记录取决于列值?
How to get Duplicate records from single table depends on column value?
我得到了 table 这样的:
declare @t1 table(Pat_Ref int,Fname VARCHAR(20), Sname VARCHAR(20),minor VARCHAR(1),SourceSys VARCHAR(40),regdt datetime)
insert into @t1
values (111,'John', 'Wayne','N','ick','2015-06-09 21:31:09.253')
,(111,'John', 'Wayne','N','ick','2014-05-09 21:31:09.253')
,(111,'John', 'Wayne',null,'hpk','2015-04-09 21:31:09.253')
,(112,'Jill', 'Smith','N','ick','2015-01-08 21:31:09.253')
,(112,'Jill', 'Smith',null,'hpk','2015-05-01 21:31:09.253')
,(113,'Bill', 'Peyton','N','ick','2015-06-09 21:31:09.253')
,(114,'Gill', 'Peyton','N','hpk','2015-06-09 21:31:09.253')
,(114,'Gill', 'Peyton','N','hpk','2015-06-12 21:31:09.253')
,(114,'Gill', 'Peyton','N','ick','2006-10-22 21:31:09.253')
,(115,'Billy', 'Peyton','N','hpk','2015-06-09 21:31:09.253')
,(116,'William', 'nixon','N','ick','2015-06-09 21:31:09.253')
,(116,'William', 'nixon','N','ick','2015-06-09 21:31:09.253')
我想要基于 Pat_Ref
的重复记录以及 SourceSys
列上 ick
和 hpk
之间的值。如果发现重复记录行必须是最近的日期 regdt
Note:
从上面的tablePat_Ref=116
,有两行但是不能重复,因为它的SourceSys
值是一样的ick
.如果该值在行上是 ick
而在另一行上是 hpk
那么它可以成为重复行。
我想要这样的结果;
Pat_Ref Fname Sname minor SourceSys regdt
111 John Wayne N ick 2015-06-09 21:31:09.253
112 Jill Smith NULL hpk 2015-05-01 21:31:09.253
114 Gill Peyton N hpk 2015-06-12 21:31:09.253
任何帮助。谢谢
希望我没听错,这就是我想出的查询,它似乎 return 预期结果:
SELECT Pat_Ref, Fname, Sname, minor, SourceSys, regdt
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY Pat_ReF ORDER BY regdt DESC) AS RN, *
FROM @t1
) AS T
CROSS APPLY (
SELECT 1
FROM @t1 AS T2
WHERE T2.Pat_Ref = T.Pat_Ref
AND T2.SourceSys BETWEEN 'hck' AND 'ick'
GROUP BY T2.Pat_Ref
HAVING COUNT(DISTINCT T2.SourceSys) > 1
) AS T2(UQ)
WHERE T.RN = 1;
解释:
我正在使用 ROW_NUMBER()
为每个 Pat_Ref
获取最新的 regdt
以防需要过滤。
我正在使用 CROSS APPLY
为每个 Pat_Ref
SourceSys
获取 DISTINCT COUNT()
,如果我理解正确,它必须匹配 ICK 和 HCK。
有任何问题 - 让我知道。
我得到了 table 这样的:
declare @t1 table(Pat_Ref int,Fname VARCHAR(20), Sname VARCHAR(20),minor VARCHAR(1),SourceSys VARCHAR(40),regdt datetime)
insert into @t1
values (111,'John', 'Wayne','N','ick','2015-06-09 21:31:09.253')
,(111,'John', 'Wayne','N','ick','2014-05-09 21:31:09.253')
,(111,'John', 'Wayne',null,'hpk','2015-04-09 21:31:09.253')
,(112,'Jill', 'Smith','N','ick','2015-01-08 21:31:09.253')
,(112,'Jill', 'Smith',null,'hpk','2015-05-01 21:31:09.253')
,(113,'Bill', 'Peyton','N','ick','2015-06-09 21:31:09.253')
,(114,'Gill', 'Peyton','N','hpk','2015-06-09 21:31:09.253')
,(114,'Gill', 'Peyton','N','hpk','2015-06-12 21:31:09.253')
,(114,'Gill', 'Peyton','N','ick','2006-10-22 21:31:09.253')
,(115,'Billy', 'Peyton','N','hpk','2015-06-09 21:31:09.253')
,(116,'William', 'nixon','N','ick','2015-06-09 21:31:09.253')
,(116,'William', 'nixon','N','ick','2015-06-09 21:31:09.253')
我想要基于 Pat_Ref
的重复记录以及 SourceSys
列上 ick
和 hpk
之间的值。如果发现重复记录行必须是最近的日期 regdt
Note:
从上面的tablePat_Ref=116
,有两行但是不能重复,因为它的SourceSys
值是一样的ick
.如果该值在行上是 ick
而在另一行上是 hpk
那么它可以成为重复行。
我想要这样的结果;
Pat_Ref Fname Sname minor SourceSys regdt
111 John Wayne N ick 2015-06-09 21:31:09.253
112 Jill Smith NULL hpk 2015-05-01 21:31:09.253
114 Gill Peyton N hpk 2015-06-12 21:31:09.253
任何帮助。谢谢
希望我没听错,这就是我想出的查询,它似乎 return 预期结果:
SELECT Pat_Ref, Fname, Sname, minor, SourceSys, regdt
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY Pat_ReF ORDER BY regdt DESC) AS RN, *
FROM @t1
) AS T
CROSS APPLY (
SELECT 1
FROM @t1 AS T2
WHERE T2.Pat_Ref = T.Pat_Ref
AND T2.SourceSys BETWEEN 'hck' AND 'ick'
GROUP BY T2.Pat_Ref
HAVING COUNT(DISTINCT T2.SourceSys) > 1
) AS T2(UQ)
WHERE T.RN = 1;
解释:
我正在使用 ROW_NUMBER()
为每个 Pat_Ref
获取最新的 regdt
以防需要过滤。
我正在使用 CROSS APPLY
为每个 Pat_Ref
SourceSys
获取 DISTINCT COUNT()
,如果我理解正确,它必须匹配 ICK 和 HCK。
有任何问题 - 让我知道。