我有一个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%。计算将很简单。但是,除非确保表中没有重复项,否则我将无法计算出这一点。
答案 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仅在以下情况下才是解决方案:
该请求已使用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 || '_%;')
)