Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql:动态正则表达式模式_Sql_Regex_Postgresql - Fatal编程技术网

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;