Sql server SQL server副本保留最新的
请您帮助cte获取以下数据集中的重复记录并使其处于非活动状态,最新日期记录应保持活动状态Sql server SQL server副本保留最新的,sql-server,Sql Server,请您帮助cte获取以下数据集中的重复记录并使其处于非活动状态,最新日期记录应保持活动状态 如果Fname、Lname和电子邮件相同-重复 如果Fname、Lname和phone相同-重复 如果custA和custb与custb有相同的电话号码,cust c有相同的电子邮件,则custc是cust a的副本(a=b=c,) 如果Fname、Lname、电子邮件和电话相同-重复 此处的输出应为仅cust 100应处于活动状态 多谢各位 CustID Fname Lname Phone
CustID Fname Lname Phone Email Date Active
100 John Doe 1234567890 NULL 10-Jan 1
200 John Doe 1234567890 a@a.com 2-Jan 1
300 John Doe NULL a@a.com 1-Jan 1
此查询将返回应保持活动状态的行:
WITH
t AS (
SELECT *
FROM (
VALUES
(100, 'John', 'Doe', 1234567890, NULL, CAST('2017-01-10' AS DATE)),
(200, 'John', 'Doe', 1234567890, 'a@a.com', CAST('2017-01-02' AS DATE)),
(300, 'John', 'Doe', NULL, 'a@a.com', CAST('2017-01-01' AS DATE))
) t(CustID, Fname, Lname, Phone, Email, Date)
),
u AS (
SELECT Fname, Lname, Phone, COALESCE(MAX(Email), Phone) AS Email, MAX(Date) AS Date
FROM t
GROUP BY Fname, Lname, Phone
),
v AS (
SELECT Fname, Lname, COALESCE(MAX(Phone), Email) AS Phone, Email, MAX(Date) AS Date
FROM u
GROUP BY Fname, Lname, Email
)
SELECT *
FROM t
WHERE EXISTS (
SELECT 1
FROM v
WHERE t.Fname = v.Fname
AND t.Lname = v.Lname
AND t.Date = v.Date
)
说明:
表只是您的数据t
表查找每个u
组的最近日期(Fname、Lname、Phone
)。它还假设,如果该组在至少一条记录上包含MAX(date)
(电子邮件
),则该MAX(Email)
属于该组。根据您的描述,这样的电子邮件
,因此我们可以使用电子邮件只能有一封
MAX()
表通过v
进行相同但相反的分组,查找该组中的最近日期Fname、Lname、Email
- 最后,我们只保留
中的记录(原始数据),该记录与最近每组记录的t
值相匹配Fname、Lname、Date
活动
标志
查询几乎相同:
WITH
u AS (
SELECT Fname, Lname, Phone, COALESCE(MAX(Email), Phone) AS Email, MAX(Date) AS Date
FROM t
GROUP BY Fname, Lname, Phone
),
v AS (
SELECT Fname, Lname, COALESCE(MAX(Phone), Email) AS Phone, Email, MAX(Date) AS Date
FROM u
GROUP BY Fname, Lname, Email
)
UPDATE t
SET active = 0
OUTPUT INSERTED.*
WHERE NOT EXISTS (
SELECT 1
FROM v
WHERE t.Fname = v.Fname
AND t.Lname = v.Lname
AND t.Date = v.Date
)
UPDATE
语句的输出显示修改后的数据:
是否保证至少有一个电话或电子邮件是非空的?是的,至少有一个电话或电子邮件应该存在,以便将记录输入表中,但这两个记录也可以存在,谢谢谢谢你,卢卡斯,我会测试并返回,但这肯定为我今后的方向提供了一个很好的方向。感谢您的帮助Hi Lukas,查询工作很好。我对在最后阶段加入date有点困惑。你能解释一下吗?这里date有时可能为null,我计划采用更新的date列值,以防实际代码中的date列变为null。我们是否根据日期作为连接条件之一来确定唯一性?您可以通过编写类似于
COALESCE(t.date,somedate)=COALESCE(v.date,somedate)
的内容来解决可为空的日期问题。是的,唯一性取决于现在的日期。如果你可能有多个“最近的日期”,你需要选择一个,也有一个解决办法,但它更复杂。