繁体   English   中英

删除重复项的好方法是什么?

[英]What is a good way to remove duplicates?

我有一个 varchar 列。 它包含由分号 (;) 分隔的值。

例如,它看起来像

10;20;21;17;20;21;22;

它并不总是 7 个元素。 它可以包含大约 30 到 70 之间的任何内容。他们以这种方式设计它的原因是因为这些值实际上是基因组片段,并且集体输入或检索它是有意义的

我需要删除具有重复列的记录,因此如果我看到具有与上述相同值的另一条记录,则需要将其删除。

如果该记录在另一条记录中包含相同的值,我还需要删除该记录。 例如,我需要删除

10;;21;17;20;21;22;

因为它与第一个相同,但没有第二个值 20。如果它比第一个更完整,我将删除第一个。

1;2;3;4;5;6;7; 1;2;3;4;5;6;7;8; 是重复的,我选择第二个,因为它更完整。 1;2;3;4;5;6;;7也是重复的。 在这种情况下,如果它们有 13 个或更多匹配的数字并且没有不匹配,我们将合并它们,使其成为单个值1;2;3;4;5;6;7;7; .

我可以在java中扫描每条记录,但我担心它会很复杂且耗时,因为该表包含数百万条记录。 我想知道它在 oracle 本身中是否可行。

我的最终目标是计算这些数字出现的频率。 例如,如果数字 10 在 100 次中出现 5 次,则为 5%。 计算将很简单。 但是,除非我首先确保表中没有重复项,否则我无法计算此值。

注意:这个答案是一个占位符,因为这个问题看起来有结束的危险,但我认为一旦所有规则都建立起来,它就值得回答。


删除完全重复的内容很简单:

delete from your_table y
where y.rowid not in ( select min(x.rowid)
                       from your_table x
                       group by x.genome_string)

困难的部分是建立具有精确匹配和空值的重复字符串。 合并行使逻辑更加复杂。

下面的 sql 是一个解决方案,仅当:

  • 1;2;3;4;5; 是更完整的形式 1;2;;5
  • 您的所有条目都以 ; 结尾

该请求已使用 sqlite 进行了测试,因此可能需要对 Oracle 进行一些更改。

它需要一个带有“VALUE”列的表“TEST”

SELECT 
    DISTINCT VALUE
from TEST As ORIGIN_TEST
WHERE NOT EXISTS (SELECT VALUE FROM TEST 
    WHERE 
        VALUE <> ORIGIN_TEST.VALUE AND
        (VALUE LIKE replace(ORIGIN_TEST.VALUE, ';;', ';_%;') OR
        VALUE LIKE ORIGIN_TEST.VALUE || '_%;')
)

暂无
暂无

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

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