我希望了解如何在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是否需要对技能列进行排序,然后将其放入字符串中,以便确定我在整个团队中拥有的确切的不同技能?
发布于 2016-12-21 16:58:33
下面是一个使用正则表达式、分层查询和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.https://stackoverflow.com/questions/41267715
复制相似问题