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

Java 删除重复项的好方法是什么?,java,oracle,Java,Oracle,我有一个varchar列。它包含以分号分隔的值 例如,它看起来像 十,;20;21;17;20;21;22; 它并不总是7个元素。它可以包含从30到70的任何东西。他们之所以这样设计,是因为这些值实际上是基因组片段,集体输入或检索它们是有意义的 我需要删除具有重复列的记录,因此如果我看到另一条具有与上面相同值的记录,我需要删除它 如果该记录在另一个记录中包含相同的值,我还需要删除该记录。例如,我需要删除 10、 );;21;17;20;21;22; 因为它与第一个值相同,但没有第二个值,20。如

我有一个varchar列。它包含以分号分隔的值

例如,它看起来像

十,;20;21;17;20;21;22;

它并不总是7个元素。它可以包含从30到70的任何东西。他们之所以这样设计,是因为这些值实际上是基因组片段,集体输入或检索它们是有意义的

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

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

10、 );;21;17;20;21;22;

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

一,;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扫描每条记录,但考虑到表中包含数百万条记录,我担心这会非常复杂和耗时。我想知道这在甲骨文本身是否可行

我的最终目标是计算这些数字出现的频率。例如,如果数字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进行一些更改

它需要一个带有列值的表测试

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

这是一个可怕的桌子设计,可能不值得任何人花时间尝试一个答案。您应该阅读有关规范化的内容,并将每个CSV值放入单独的记录中。如果有更好的表格设计,你的问题会非常简单。是别人设计的,所以我没有选择。我知道这很可怕。我还将值分解为单独的列,因此每个记录都是这样的:full value | value1 | value2 | value3 |等等。。。我不知道这是否有助于我删除DUP。Andy,首先按照你的建议拆分这些值。确保添加合成密钥。然后使用投影选择对值进行排序。然后您可以轻松地重新移动副本。需要进一步澄清。总是有七个元素吗?34岁;;67;88;20;;67和34;23;;88;20;42; 相互重复?如果是,你会保留哪一个?是99;;; 如果没有其他记录将99作为val4,则为唯一记录?因为删除完全相同的副本很简单。困难的部分是建立具有精确匹配和空值的复制字符串。您的问题和您的表设计一样模糊。感谢您将我的问题组合在一起。我想让它变得简单,但似乎需要更多的细节,所以谢谢你。现在您提到了第二个场景,其中我需要合并数据,这使得问题比我最初想要的复杂得多。我想我会找到一种在Java中尽可能高效地实现这一点的方法。我想我现在就要结束这篇文章了。谢谢你抽出时间,不客气。我认为在SQL中解决这个问题是可能的,但几乎可以肯定的是,使用MODEL子句或MATCH语句需要一些粗糙的逻辑。这些是深奥的语法,即使是经验丰富的SQL专业人士也面临挑战。因为您可以轻松地用Java编写它,所以这似乎是更好的方法。