Oracle - 识别主导记录

时间:2017-11-17 00:22:33

标签: string oracle comparison

我有一个表格,其中包含两个STRING值(所有单个字词)以及COUNT每次出现的相应STRING,例如

ID  STR_1       COUNT_1   STR_2     COUNT_2
1   ORANGES     2         APPLES    10
2   APPLES      10        ORANGES   2
3   ORANGES     2         BANANAS   1
4   BANANAS     1         APPLES    10
5   BANANAS     1         ORANGES   2

N.B。 STR_1被视为“主”值。此外,每个COUNT值的STRINGSTR_1STR_2之间以及行之间保持一致(例如ORANGES将始终具有COUNT } 2

我想要达到的目的是删除例如存在“对映体”的记录;在上述数据中,ID 2将被视为ID 1ID 1.STR_1 = ID.2 STR_2ID 1.STR_2 = ID.2 STR_1)的“对映体”,但ID 2将被视为主要记录放弃ID 1(因为COUNT的{​​{1}}大于APPLES的{​​{1}}) - 因此所需的输出将是;

COUNT

IF 存在一种情况,即不同ORANGES匹配之间的ID STR_1 COUNT_1 STR_2 COUNT_2 2 APPLES 10 ORANGES 2 3 ORANGES 2 BANANAS 1 4 BANANAS 1 APPLES 10 值匹配,最长的COUNT将被视为主导记录并保留例如;

STRINGS

输出所需的输出;

STRING

测试数据;

ID  STR_1       COUNT_1   STR_2     COUNT_2
1   ORANGES     10        APPLES    10
2   APPLES      10        ORANGES   10
3   ORANGES     10        BANANAS   1
4   BANANAS     1         APPLES    10
5   BANANAS     1         ORANGES   10

非常感谢任何寻求上述解决方案的帮助。

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

使用反连接(not exists运算符):

select * 
from test_data t
where not exists (
   select 1 from test_data t1
   where t.str_1 = t1.str_2
    and  t.str_2 = t1.str_1
    and ( 
       t.count_1 < t1.count_1
       or
       t.count_1 = t1.count_1
       and 
       length( t.str_1 ) < length( t1.str_1 )
    )
)
order by id

如果对于给定的一对行,计数和长度都相等,则查询会选择两行。