识别重复记录并更新其上的标记

时间:2017-11-03 06:33:05

标签: oracle duplicates

有一张表 - 让我们称之为DemoReport - 使用下面的一组键。

  • YearOfGeneration
  • WeekOfGeneration
  • Key3
  • Key4

还有一列用于表示最新记录的标志。此列不是密钥的一部分。如果此标志为true,则特定记录是最新记录。 通过代码创建记录时,默认情况下此标志设置为true。

示例记录应如下所示:

    | *YearOfGeneration* | *WeekOfGeneration* | *Key3*        | *Key4*      | *Latest*
    | 2017               | 2                  | Key3Sample1   | Key4Sample1 | 1
    | 2017               | 3                  | Key3Sample1   | Key4Sample1 | 1

Key3Key4相同时,任何记录都应标记为最新,YearOfGenerationWeekOfGeneration应为最新记录。因此,在上面的例子中,第二条记录应该将最新标志设置为true,首先应该将其设置为false。

要求是编写一个sql,它将识别和更新记录以取消设置最新的记录。在最新的记录上标记。

有人可以建议如何编写sql?

2 个答案:

答案 0 :(得分:0)

UPDATE DemoReport 
SET latest = 0 -- Whatever older record should be marked as 
WHERE 
(YearOfGeneration ||LPAD(WeekOfGeneration,2,'0')|| Key3||Key4) 
NOT IN 
(SELECT 
MAX(YearOfGeneration || LPAD(WeekOfGeneration,2,'0'))|| Key3 || Key4
FROM DemoReport
GROUP BY Key3, Key4);

Commit;

答案 1 :(得分:0)

您可以使用row_number ()获取有效记录,使用合并语句来更新相应的记录。

MERGE INTO DemoReport m
     USING (SELECT d.*,
                   CASE
                      WHEN     ROW_NUMBER ()
                               OVER (
                                  PARTITION BY key3, key4
                                  ORDER BY
                                     YearOfGeneration DESC,WeekOfGeneration DESC) !=
                                  1
                           AND LATEST = 1
                      THEN
                         0
                      ELSE
                         LATEST
                   END
                      new_latest
              FROM DemoReport d) s
        ON (    m.key3 = s.key3
            AND m.key4 = s.key4
            AND m.WeekOfGeneration = s.WeekOfGeneration)
WHEN MATCHED
THEN
   UPDATE SET m.latest = s.new_latest;