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

时间:2019-02-12 07:06:40

标签: java oracle

我有一个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%。计算将很简单。但是,除非确保表中没有重复项,否则我将无法计算出这一点。

2 个答案:

答案 0 :(得分:1)

注意:该答案是一个占位符,因为该问题似乎有被关闭的危险,但是我认为一旦所有规则都建立起来,就应该是一个答案。


删除重复项很简单:

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

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

答案 1 :(得分:0)

以下sql仅在以下情况下才是解决方案:

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

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

期望表“ TEST”具有列“ VALUE”

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 || '_%;')
)