【问题标题】:Remove the duplicate SerialNo occurrences keeping only one with the latest occurrence by TimeStamp删除重复的 SerialNo 事件,仅保留一个与 TimeStamp 的最新事件
【发布时间】:2022-06-27 22:57:05
【问题描述】:

所以我有一个只包含 2 列的表,一个是 SerialNo,另一个是 TimeStamp。有时该表在不同的时间戳有多个序列条目。我想要的是删除这些多个条目,但只保留一个,即最新记录。

数据示例如下所示:

SerialNo TimeStamp Status
1548 06/27/2022 12:30 pm Success
1543 06/27/2022 12:32 pm Success
1432 06/27/2022 12:33 pm Success
1511 06/27/2022 12:34 pm Success
1511 06/27/2022 12:45 pm Success
1511 06/27/2022 12:48 pm Success
1000 06/27/2022 12:50 pm Success
1549 06/27/2022 12:51 pm Success
1435 06/27/2022 12:52 pm Success
1435 06/27/2022 12:53 pm Success

我想要的是:

SerialNo TimeStamp Status
1548 06/27/2022 12:30 pm Success
1543 06/27/2022 12:32 pm Success
1432 06/27/2022 12:33 pm Success
1511 06/27/2022 12:48 pm Success
1000 06/27/2022 12:50 pm Success
1549 06/27/2022 12:51 pm Success
1435 06/27/2022 12:53 pm Success

我试过玩,但我无法解决这个问题。我已经提到了不同的论坛,但无法找到正确的方法来做到这一点。我目前所做的是完全删除重复的行而不保留最新记录。

我当前的代码是:


DELETE FROM TableName 
        WHERE SerialNo IN(
        SELECT SerialNo FROM 
            (SELECT SerialNo, ROW_NUMBER() OVER (PARTITION BY [SerialNo] ORDER BY TimeStamp ASC)
                AS [ItemNumber] FROM  TableName) 
            a WHERE ItemNumber > 1)
        

这可能吗?

【问题讨论】:

  • 是的,可以做到。但是,让我们澄清一下您使用的数据库:问题标记为 mysql,但查询中使用的语法是针对 ms sql server 或 sqlite。那么,您实际使用的是哪一个?
  • @Shadow 是的,你是对的,我很抱歉。我正在使用 ms sql 服务器

标签: sql-server duplicates


【解决方案1】:

在 MySQL 上你可以使用:

DELETE t1.* 
FROM tbl t1
INNER JOIN ( select SerialNo,
                    Time_Stamp,
                    row_number() over(partition by SerialNo order by str_to_date(Time_Stamp,"%m/%d/%Y %l:%i %p") desc ) as row_num
             from tbl
            ) as t2 on t1.SerialNo=t2.SerialNo and t1.Time_Stamp=t2.Time_Stamp 
WHERE t2.row_num > 1;

上述查询将只删除那些 row_num > 1 的重复值。

row_number() over(partition by SerialNo order by str_to_date(Time_Stamp,"%m/%d/%Y %l:%i %p") desc ) as row_num

上面的行将根据 SerialNo 进行分区,并按最新的 Time_stamp 排序。我使用 str_to_date 函数进行字符串到日期的转换。如果 row_num 为 >1 ,则该值是重复的

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=2e75c81fba8d319f3405fb7f5d46f2cc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多