繁体   English   中英

SQL-删除重复项

[英]SQL - Removing duplicates

尽管从技术上讲不是重复项,但是有没有办法删除只有1列不同的结果? 想要保留最高百分比的行。

数据库:DB2

无论如何,我可以删除可能是这样的重复项吗?:

ID| NAME | VALUE
1 | Test | 0.3455%
1 | Test2 | 0.435%
5 | Test | 0.3455%
5 | Test2 | 0.435%

样本数据:

ID |       NAME       |  VALUE
42 | Water Fill Level | 0.78345%
42 | Valve Fill Level | 0.8546%
65 | Water Fill Level | 0.8934%
65 | Valve Fill Level | 0.93564%

如果您还有其他列,则可能需要:

select t.*
from (select t.*, row_number() over (partition by id, column1 order by column2 desc) as seqnum
     from t
    ) t
where seqnum = 1;
select id, column1, max(column2) 
from table
group by id, column1

此查询获取每个ID(列1)的最大百分比。 可以使用此查询创建一个新表,然后可以将该表重命名为原始表以获得所需的结果。

从技术上讲,您所要的不确定。 假设你有

在此处输入图片说明

现在,绝对不确定结果应该是什么(当您有3列时有3种可能性)。 尝试使您的方法更全面。 并根据您的具体要求编辑您的问题。

要删除不需要的行,这是最简单的方法

DELETE FROM
(   SELECT T.*
    ,      ROW_NUMBER() OVER (PARTITION BY ID, NAME ORDER BY VALUE DESC) AS SEQNUM
    FROM T
)
WHERE SEQNUM > 1

您的价值栏是否正确地与比较运算符进行了评估? 如果是这样,这应该起作用:

delete from mytable a where value < 
(select max(value) from mytable b where a.id = b.id and a.name = b.name)

如果由于“值”列中的值相同而仍然存在重复项,则可以使用以下方法删除其余部分:

delete from mytable a where rrn(a) < 
(select max(rrn(b)) from mytable b where a.id = b.id and a.name = b.name and a.value = b.value)

如果比较运算符的行为不正确(将以上查询从Deletes更改为selects以进行检查,则应检查!!),则可能需要做一些技巧才能使其工作。 regexp_replace()和cast将是我前进的方向。 如果我误解了您,并且您想删除所有具有相同ID或相同名称的较小百分比,请在查询中将“ and”更改为“ or”:

delete from mytable a where value < 
(select max(value) from mytable b where a.id = b.id or a.name = b.name)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM