当前位置: 首页 > 知识库问答 >
问题:

删除具有最早日期的重复行

相弘方
2023-03-14
  • Middlename
  • lastname
  • dob
  • 地址
  • 城市
  • 状态
  • 电话
  • 验证日期

它有许多相同的行,除了有效日期。例如:

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。

共有1个答案

田昊天
2023-03-14

试试这个:

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中的示例。

以上作品由:

    null
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中最早日期的最有效方法是什么? 问题答案: 无法避免空值检查,但是通过一些重构,您可以使其变得更轻松。 创建一个安全地比较两个日期的方法: 然后结合调用: 实际上,您可以将此方法用作任何通用方法: