它有许多相同的行,除了有效日期。例如:
steve,s,smith, 19710909,112 crazy st,miami,fl,3055551212,201609
steve,s,smith, 19710909,112 crazy st,miami,fl,3055551212,201002
steve,s,smith, 19710909,112 crazy st,miami,fl,3055551212,201706
steve,s,smith, 19710909,112 crazy st,miami,fl,3055551212,199812
我希望运行一个脚本,删除除最后一列(validitydate
)以外的所有匹配的重复项,只在表中保留以下内容,这是201706
:
steve,s,smith, 19710909,112 crazy st,miami,fl,3055551212,201706
DELETE
FROM PF_temp
LEFT OUTER JOIN
(
SELECT Min(ValidityDate) as RowId
, firstname
, middlename
, lastname
, DOB
, address
, city
, state
, phone
FROM PF_temp
GROUP BY firstname
, middlename
, lastname
, DOB
, address
, city
, state
, phone
, validitydate
) as KeepRows
ON TableName.RowId = KeepRows.RowId
WHERE KeepRows.RowId IS NULL
它不起作用,实际上弹出以下错误:
Msg 156, Level 15, State 1, Line 2
Incorrect syntax near the keyword 'OUTER'.
Msg 156, Level 15, State 1, Line 4
Incorrect syntax near the keyword 'as'.
另外,我想根据字母表的最后一个字母分阶段运行它。因此,需要在某个地方添加类似where'a%'
这样的lastname。
试试这个:
delete a
from PF_Temp a
inner join PF_Temp b
on b.firstname = a.firstname
and b.middlename = a.middlename
and b.lastname = a.lastname
and b.DOB = a.DOB
and b.address = a.address
and b.city = a.city
and b.state = a.state
and b.phone = a.phone
and b.validitydate > a.validitydate
SQL Fiddle中的示例。
以上作品由:
delete a
from PF_Temp a
inner join PF_Temp b
on ((b.firstname = a.firstname) or (b.firstname is null and a.firstname is null))
and ((b.middlename = a.middlename) or (b.middlename is null and a.middlename is null))
and ((b.lastname = a.lastname) or (b.lastname is null and a.lastname is null))
and ((b.DOB = a.DOB) or (b.DOB is null and a.DOB is null))
and ((b.address = a.address) or (b.address is null and a.address is null))
and ((b.city = a.city) or (b.city is null and a.city is null))
and ((b.state = a.state) or (b.state is null and a.state is null))
and ((b.phone = a.phone) or (b.phone is null and a.phone is null))
and b.validitydate > a.validitydate
上述方法的另一种选择是coalesce(b.firstname,'')=coalesce(a.firstname)上的(对所有其他匹配字段重复该模式);尽管这意味着空值和空值的处理是一样的,并且不会表现得很好。
替代方法
另一种方法是使用一个子查询回调所有值,用匹配的值对每个集合进行编号,从最近的有效日期1开始。然后删除所有返回的数字高于1的行;即任何有效日期较早的副本。
delete TheDeletables
from
(
select *
, row_number() over (
partition by
firstname
, middlename
, lastname
, DOB
, address
, city
, state
, phone
order by validitydate desc
) rowid
from PF_Temp
) TheDeletables
where rowid > 1;
问题内容: 我必须清理具有重复行的表: 一个可能具有多个值: 我想对整个表执行一个查询,并删除和重复的所有行。在上面的示例中,删除后,我只想剩下1、2、4和5。 问题答案: ;WITH x AS ( SELECT id, gid, url, rn = ROW_NUMBER() OVER (PARTITION BY gid, url ORDER BY id) FROM dbo.table ) SEL
问题内容: 我有以下带有重复信息的示例数据: 根据上述数据集,如何删除重复的Emp ID,而仅保留指定了最大日期/时间的Emp ID? 因此,根据以上内容,我只会看到ID:1、3和5。 谢谢。 问题答案: 就像是:
问题内容: 这个问题已经在这里有了答案 : SQLite删除查询错误 (3个答案) 7年前关闭。 我试图通过以下命令对SQLite中的表进行别名化(例如,这本书是我正在阅读“ Ramakrishnan的数据库管理系统”的书) 此代码给出了语法错误。在不使用别名的情况下,以下代码有效: 但是,如果我想为表加上别名,该怎么办?有人可以帮忙吗? 谢谢 问题答案: 该语句在单个表上运行,并且不使用表别名。
问题内容: 我使用以下命令删除了一年以上的文件。 但是,现在我想删除所有修改时间 早于2014年1月1日的文件 我如何在Linux中做到这一点。 问题答案: 您可以将时间戳记作为文件,并将其用作参考点: 例如,2014年1月1日: 之所以有效,是因为我们正在使用一个开关。 来自:
问题内容: 我在Java中有三个约会:a,b,c。这些日期中的任何一个或所有日期都可以为空。在没有大量if- else块的情况下确定a,b,c中最早日期的最有效方法是什么? 问题答案: 无法避免空值检查,但是通过一些重构,您可以使其变得更轻松。 创建一个安全地比较两个日期的方法: 然后结合调用: 实际上,您可以将此方法用作任何通用方法: