我有一个表,看起来像这样:
Week | Value1 | Value2 | Value3
-----|--------|--------|-------
1 | A | A | 5
1 | A | B | 10
1 | B | B | 15
2 | A | A | 10
2 | A | B | 15
2 | B | B | 20
2 | A | A | 10
2 | A | B | 15
2 | B | B | 25
我想删除Week、Value 1和Value 2匹配的多余行,但保留原始行不变。因此,所需的结果如下所示:
Week | Value1 | Value2 | Value3
-----|--------|--------|-------
1 | A | A | 5
1 | A | B | 10
1 | B | B | 15
2 | A | A | 10
2 | A | B | 15
2 | B | B | 20
我可以使用以下代码选择需要删除的数据:
select *
from (
select *, row_number() over(partition by week, value1, value2 order by week, value1, value2) as row
from mytable
)
where row >1
有人知道如何最好地从表中实际删除这些行吗?
我使用的是db2数据库,如果这有助于缩小哪些函数有效/无效的范围的话。
4条答案
按热度按时间t5fffqht1#
不幸的是,在许多数据库中,删除完全重复的数据是很棘手的,我认为在DB2中也是如此。一种选择是添加一个新列来唯一标识每一行。另一种选择是重新创建表:
如果每一行都有一个唯一的id,则只需用途:
uhry853o2#
您想要删除具有较低值3的同级行(以便只保留具有最低值3的行)。
62o28rlo3#
请尝试以下操作。它至少可以在Db2上为LUW工作。
6mw9ycah4#
有很多方法可以解决编码问题。我使用iSeries DB2和SQL,但不熟悉其他平台上的DB2。由于您有正确标识要删除的行的SQL语句,另一种解决方案可能是...
这将清除表,但更好的解决方案是如前面所建议的那样在插入时防止重复。