有一张表 - 让我们称之为DemoReport
- 使用下面的一组键。
YearOfGeneration
WeekOfGeneration
Key3
Key4
还有一列用于表示最新记录的标志。此列不是密钥的一部分。如果此标志为true,则特定记录是最新记录。 通过代码创建记录时,默认情况下此标志设置为true。
示例记录应如下所示:
| *YearOfGeneration* | *WeekOfGeneration* | *Key3* | *Key4* | *Latest*
| 2017 | 2 | Key3Sample1 | Key4Sample1 | 1
| 2017 | 3 | Key3Sample1 | Key4Sample1 | 1
当Key3
和Key4
相同时,任何记录都应标记为最新,YearOfGeneration
和WeekOfGeneration
应为最新记录。因此,在上面的例子中,第二条记录应该将最新标志设置为true,首先应该将其设置为false。
要求是编写一个sql,它将识别和更新记录以取消设置最新的记录。在最新的记录上标记。
有人可以建议如何编写sql?
答案 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;