如何以ASC顺序在SQL中排序序列

时间:2016-12-21 16:38:54

标签: sql oracle

我正在寻找如何在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

是否需要订购技能专栏,然后将其放入一个字符串中,以便我可以确定整个团队的确切技能?

1 个答案:

答案 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.
相关问题