db2 是否使用SQL删除值相同的剩余行?

mkh04yzy  于 2022-11-07  发布在  DB2
关注(0)|答案(4)|浏览(171)

我有一个表,看起来像这样:

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数据库,如果这有助于缩小哪些函数有效/无效的范围的话。

t5fffqht

t5fffqht1#

不幸的是,在许多数据库中,删除完全重复的数据是很棘手的,我认为在DB2中也是如此。一种选择是添加一个新列来唯一标识每一行。另一种选择是重新创建表:

create temporary table temp_mytable as
    select distinct week, value1, value2
    from mytable;

truncate mytable;

insert into mytable (week, value1, value2)
    select week, value1, value2
    from temp_mytable;

如果每一行都有一个唯一的id,则只需用途:

delete from mytable
    where id <> (select min(t2.id)
                 from mytable t2
                 where t2.week = t.week and t2.value1 = t.value1 and t2.value2 = t.value2
                );
uhry853o

uhry853o2#

您想要删除具有较低值3的同级行(以便只保留具有最低值3的行)。

delete from mytable
where exists
(
  select null
  from mytable better_row
  where better_row.week = mytable.week
  and better_row.value1 = mytable.value1
  and better_row.value2 = mytable.value2
  and better_row.value3 < mytable.value3
);
62o28rlo

62o28rlo3#

请尝试以下操作。它至少可以在Db2上为LUW工作。

DELETE FROM
(
SELECT ROW_NUMBER () OVER (PARTITION BY WEEK, VALUE1, VALUE2 ORDER BY VALUE3) RN_ 
FROM MYTABLE
)
WHERE RN_ <> 1;
6mw9ycah

6mw9ycah4#

有很多方法可以解决编码问题。我使用iSeries DB2和SQL,但不熟悉其他平台上的DB2。由于您有正确标识要删除的行的SQL语句,另一种解决方案可能是...

1.  Use an insert with the select statement that identifies the rows that are to be deleted and include RRN() in the select clause.
2.  Then perform the delete statement based on RRN.

这将清除表,但更好的解决方案是如前面所建议的那样在插入时防止重复。

相关问题