sql - 使用oracle sql查找最小非重复序列
问题描述
考虑一个由字母组成的序列a,g,c,t
。您必须找到最小的非重复字符序列及其长度。还要注意非重复字符应该按顺序排列。
例如,在序列'aaggcct'
中,答案是最小不重复字符是t
哪里t
是最少不重复的字符集,长度是1
。即使aa,gg,cc,ag,gc,ct
不重复,因为t
最少不重复长度1
,答案是t.
当我说不t
重复时那么t
序列中就没有其他的了。
例如,对于序列'aaggcctt'
,答案之一是aa,
最少不重复的字符集。即使aag
不重复,最少不重复长度也是 2,因此不考虑。当我说不重复时,序列'aa'
中没有其他内容。aa
完整答案如下
DATA LENGTH
ag 2
gg 2
ct 2
cc 2
aa 2
tt 2
gc 2
'aaagggcccttt'
这里重复了另一个序列示例,aa
因此不在答案中。当我说'aa'
重复时,因为'aaa'
有两个'aa'
从位置 1aa
开始,然后是位置 2aa
DATA LENGTH
ag 2
ct 2
gc 2
解决方案
查找字符串的所有子字符串,然后计算它们以查看其中有多少重复并排除任何不唯一的子字符串,然后找到每个字符串具有最小长度的子字符串集:
所以,如果你有测试数据:
CREATE TABLE test_data ( id, value ) AS
SELECT 1, 'agaga' FROM DUAL UNION ALL
SELECT 2, 'aaggcct' FROM DUAL UNION ALL
SELECT 3, 'aaggcctt' FROM DUAL UNION ALL
SELECT 4, 'aaagggcccttt' FROM DUAL;
然后你可以使用:
WITH substrings ( id, value, length, pos ) AS (
SELECT id,
value,
LENGTH( value ),
1
FROM test_data
UNION ALL
SELECT id,
value,
CASE pos
WHEN 1
THEN length - 1
ELSE length
END,
CASE pos
WHEN 1
THEN LENGTH(value) - (length-2)
ELSE pos-1
END
FROM substrings
WHERE length > 1
OR pos > 1
),
non_repeats ( id, value, substring ) AS (
SELECT id,
MIN( value ),
SUBSTR( value, pos, length )
FROM substrings s
GROUP BY id, SUBSTR( value, pos, length )
HAVING COUNT(*) = 1
)
SELECT id,
value,
substring
FROM (
SELECT id,
value,
substring,
RANK() OVER ( PARTITION BY id ORDER BY LENGTH( substring ) ASC ) AS rnk
FROM non_repeats
)
WHERE rnk = 1;
哪个输出:
身份证 | 价值 | 子串 -: | :----------- | :-------- 1 | 阿加加 | 插科打诨 2 | aaggcct | 吨 3 | aaggcctt | GC 3 | aaggcctt | 抄送 3 | aaggcctt | ct 3 | aaggcctt | 银 3 | aaggcctt | 啊 3 | aaggcctt | tt 3 | aaggcctt | gg 4 | aaagggcccttt | ct 4 | aaagggcccttt | GC 4 | aaagggcccttt | 银
db<>在这里摆弄
推荐阅读
- ember.js - Ember、PostCSS、SASS 和 @apply 的问题
- swift - 不受支持的架构 - Metal 和 Swift 之间的共享枚举
- java - 无法为 org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler 类型的对象设置未知属性“nav_version”
- laravel - 带模型和变量的路由
- c - 控件不流过第 45 行
- angular - ReferenceError:未定义 HTMLVideoElement
- sql - 如何更改具有 3600 万行的临时表以添加新列?
- ibm-cloud - 语音识别、批处理、语音分析、404【无此类子资源】
- reactjs - 做出反应。如何在组件树中调用特定子子项的方法
- php - 如何在 Codeigniter 4 中为所有页面设置特定语言