Postgresql:动态正则表达式模式
我的事件数据如下所示:Postgresql:动态正则表达式模式,sql,regex,postgresql,Sql,Regex,Postgresql,我的事件数据如下所示: id | instance_id | value 1 | 1 | a 2 | 1 | ap 3 | 1 | app 4 | 1 | appl 5 | 2 | b 6 | 2 | bo 7 | 1 | apple 8 | 2 | boa 9 | 2 | boa
id | instance_id | value
1 | 1 | a
2 | 1 | ap
3 | 1 | app
4 | 1 | appl
5 | 2 | b
6 | 2 | bo
7 | 1 | apple
8 | 2 | boa
9 | 2 | boat
10 | 2 | boa
11 | 1 | appl
12 | 1 | apply
基本上,每一行都是用户键入的新字母。他们还可以删除字母
我想创建一个类似这样的数据集,我们称之为data
id | instance_id | value
7 | 1 | apple
9 | 2 | boat
12 | 1 | apply
我的目标是提取每个实例中的所有完整单词,同时考虑删除-因此仅获取最长的单词或最近键入的单词是不够的
为了做到这一点,我计划进行如下的正则表达式操作:
select * from data
where not exists (select * from data d2 where d2.value ~ (d.value || '.'))
实际上,我正在尝试构建一个动态正则表达式,它添加的匹配字符比当前多一个,并且特定于它所匹配的行
上面的代码似乎不起作用。在Python中,我可以在使用正则表达式模式之前“编译”它。在PostgreSQL中,动态构建模式的等效方法是什么?尝试使用simple LIKE运算符,而不是正则表达式模式:
SELECT * FROM data d1
WHERE NOT EXISTS (
SELECT * FROM data d2
WHERE d2.value LIKE d1.value ||'_%'
)
演示:
在
value
列上创建一个索引,这将加快查询速度。在顺序数据中查找峰值是一个不错的选择。您只需使用以下方法将每个值与上一个值和下一个值进行比较:
你怎么知道一个词是什么?我的意思是,为什么“boa”和“a”以及“app”不在你的列表中呢?听起来更像是你想把所有的值和字典进行比较。我无法想象正则表达式在这里会有多大帮助(至少完全靠它们自己来完成这项工作)。嘿,伙计们,实际上对字典中的单词一点也不感兴趣(我们的实际数据无论如何都不是字典中的单词)。我们看到两个三角形图案,我对“峰”感兴趣,即:a>aa>aaa>aaaa>aaa>aaa>aab有两个峰:aaaa和AAAB。Abelisto,你能分享一下这个答案吗?这对我的基本情况很有用,谢谢!但是,有没有一种方法可以构建动态模式?
with cte as (
select
*,
length(value) > coalesce(length(lead(value) over (partition by instance_id order by id)),0) and
length(value) > coalesce(length(lag(value) over (partition by instance_id order by id)),length(value)) as is_peak
from data)
select * from cte where is_peak order by id;