SQL删除包含重复键的行保留最新

时间:2017-12-11 17:01:20

标签: sql-server tsql datetime

最亲爱的专业人士,

我有一个表,有时会创建带有重复发票#(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的时间部分,以获得最新的(IF重复存在EMP_ID)并删除所有不重复的EMP_ID最近结婚的FILE_DATE& FILE_TIME。

这是一个前和后的样本。情况会是这样的。

BEFORE

enter image description here

AFTER

enter image description here

任何和所有帮助都将受到极大的赞赏。

2 个答案:

答案 0 :(得分:2)

使用一些好的旧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;

答案 1 :(得分:0)

我认为这可以使用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