gpt4 book ai didi

sql - 保持唯一的字符串缩写

转载 作者:行者123 更新时间:2023-12-01 19:37:30 36 4
gpt4 key购买 nike

我有一个唯一的字符串列表(最初的想法是表中的列名)。任务是执行列表的最大可能缩写,以便列表保持不同。

例如AAA, AB可以缩写为AA, AB 。 (但不是 A, AB - 因为 A 可以是 AAAAB 的前缀)。 AAAA, BAAAA可以缩短为 A, B 。但是A1, A2根本不能缩写。

这是示例数据

create table tab as 
select 'AAA' col from dual union all
select 'AABA' col from dual union all
select 'COL1' col from dual union all
select 'COL21' col from dual union all
select 'AAAAAA' col from dual union all
select 'BBAA' col from dual union all
select 'BAAAA' col from dual union all
select 'AB' col from dual;

预期结果是

COL    ABR_COL                
------ ------------------------
AAA AAA
AAAAAA AAAA
AABA AAB
AB AB
BAAAA BA
BBAA BB
COL1 COL1
COL21 COL2

我管理了一个由四个子查询组成的强力解决方案,我没有故意发布它,因为我希望存在一个更简单的解决方案,我不想分散注意力。

顺便说一句,r中有一个类似的功能叫 abbreviate ,但我正在寻找 SQL 解决方案。首选Oracle欢迎其他 RDBMS 的解决方案。

最佳答案

我会在递归 CTE 中进行过滤:

with potential_abbreviations(col, abbr, lev) as (
select col, col as abbr, 1 as lev
from tab
union all
select pa.col, substr(pa.abbr, 1, length(pa.abbr) - 1) as abbr, lev + 1
from potential_abbreviations pa
where length(abbr) > 1 and
not exists (select 1
from tab
where tab.col like substr(pa.abbr, 1, length(pa.abbr) - 1) || '%' and
tab.col <> pa.col
)
)
select pa.col, pa.abbr
from (select pa.*, row_number() over (partition by pa.col order by pa.lev desc) as seqnum
from potential_abbreviations pa
) pa
where seqnum = 1

Here是一个数据库<> fiddle 。

lev 完全没有必要。您可以在 order by 中使用 length(abbr) desc。但是,当我使用递归 CTE 时,我通常会包含一个递归计数器,所以这是习惯。

在 CTE 中进行额外的比较可能看起来更复杂,但它简化了执行 - 递归在正确的值处停止。

这也在唯一的单字母 col 值上进行了测试。

关于sql - 保持唯一的字符串缩写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52676767/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com