我正在寻找如何在SQL中订购序列以删除任何重复值。
例如,如果我有以下数据集:
Set_of_skills
ABC/DEF/GHI
DEF/GHI/ABC
GHI/ABC/DEF
我运行了以下查询:
SELECT distinct set_of_skills FROM Table1;
这将带回我理解的所有这些行,但我想要做的是按升序排序技能,因为这会给我以下内容:
Set_of_skills_1
ABC/DEF/GHI
ABC/DEF/GHI
ABC/DEF/GHI
现在,如果我要运行一个独特的查询,这将告诉我所有这些实际上是相同的技能,而不是3个不同的技能。
如果有人能就如何实现这一目标提出建议,我将不胜感激,我将非常感激。
提前致谢。
更新
因为我有一个数据规范化的表,所以如果我的表中的数据如下:
AGENT_ID | Set_of_skills
1 | ABC
1 | DEF
1 | GHI
2 | DEF
2 | GHI
2 | ABC
3 | GHI
3 | ABC
3 | DEF
是否需要订购技能专栏,然后将其放入一个字符串中,以便我可以确定整个团队的确切技能?
答案 0 :(得分:3)
以下是使用正则表达式,分层查询和listagg()
的快速解决方案。话虽如此,你应该真正修复你的数据模型。
例如,您可以使用内部查询(没有外部查询)来简单地规范化您当前的数据。
with
test_data ( Set_of_skills ) as (
select 'ABC/DEF/GHI' from dual union all
select 'DEF/GHI/ABC' from dual union all
select 'GHI/ABC/DEF' from dual
)
-- end of test data; SQL query begins below this line
select set_of_skills,
listagg(token, '/') within group (order by token) as ordered_set_of_skills
from ( select set_of_skills,
regexp_substr(set_of_skills || '/', '([^/]*)/', 1, level, null, 1) as token
from test_data
connect by level <= 1 + regexp_count(set_of_skills, '/')
and prior set_of_skills = set_of_skills
and prior sys_guid() is not null
)
group by set_of_skills
;
SET_OF_SKILLS ORDERED_SET_OF_SKILLS
-------------------- -----------------------
ABC/DEF/GHI ABC/DEF/GHI
DEF/GHI/ABC ABC/DEF/GHI
GHI/ABC/DEF ABC/DEF/GHI
3 rows selected.