【问题标题】:SQL Delete Rows with Duplicate Key Keeping Most RecentSQL删除行与重复键保持最新
【发布时间】:2017-12-11 17:01:20
【问题描述】:

尊敬的专业人士,

我有一个表,有时会使用重复的发票编号 (EMP_ID) 创建行。在这些行中,有单独的日期 (FILE_DATE) 和时间 (FILE_TIME) 列(那里的天才数据库设计)。我需要删除此数据库中任何重复 EMP_ID 的旧行,保留最近的日期(来自 FILE_DATE)+ 时间(来自 FILE_TIME)。

FILE_DATE 和 FILE_TIME 都是数据库中的日期/时间字段。我们使用的软件会写入此表,将发票日期添加到 FILE_DATE 列,其中 YYYY-MM-DD 00:00:00.000(所有的零都是硬编码的)。然后 FILE_TIME 字段具有 1900-01-01 HH:mm:ss.SSS,即 1900-01-01 硬编码。 (时间戳来自该行被写入数据库的时间)

所以,长话短说,我需要将这两者结合在一起,以获取 FILE_DATE 的 DATE 部分和 FILE_TIME 的时间部分,以获取最新的(如果 EMP_ID 存在重复项)并删除所有不重复的重复项最近结婚的 FILE_DATE 和 FILE_TIME。

以下是之前和之后情况的示例。

之前

之后

我们将非常感谢任何和所有帮助。

【问题讨论】:

    标签: sql-server tsql datetime


    【解决方案1】:

    使用一些不错的旧 CTE“魔法”:

    WITH CTE AS (
        SELECT *,
               ROW_NUMBER() OVER (PARTITION BY EMP_ID
                                  ORDER BY FILE_DATE DESC, FILE_TIME DESC) AS RN
        FROM YourTable)
    DELETE FROM CTE
    WHERE RN > 1;
    

    【讨论】:

    • 所以,基本上只是按日期排序,然后 TIME desc 将它们保持在一起,而不必将单独列中的日期和时间部分结合在一起? (叹息......我似乎总是想办法过度思考明显/简单的问题)。谢谢,对于任何重复的废话,我们深表歉意。
    【解决方案2】:

    我认为这可以使用 MAX 和 GROUP BY 来完成:

       select   B.EMP_ID
                 , B.File_date
                 , Max(B.File_Time) as MaxFileTime
                 , B.DESC_TEXT_1
        from     Before B
        group
        by       B.EMP_ID
                 , B.File_date
                 , B.DESC_TEXT_1
    

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 2011-08-31
      • 1970-01-01
      • 2020-07-05
      • 2021-11-16
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多