Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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
查找连续模式(使用SQL)_Sql_Postgresql_Gaps And Islands - Fatal编程技术网

查找连续模式(使用SQL)

查找连续模式(使用SQL),sql,postgresql,gaps-and-islands,Sql,Postgresql,Gaps And Islands,PostgreSQL中的表连续: 每个se_id都有一个idx 从0到100-这里是0到9 搜索模式: SELECT * FROM consecutive WHERE val_3_bool = 1 AND val_1_dur > 4100 AND val_1_dur < 5900 选择* 从连续 其中val_3_bool=1 val_1_dur>4100,val_1_dur

PostgreSQL中的表
连续
:
每个
se_id
都有一个
idx
从0到100-这里是0到9

搜索模式:

SELECT *
FROM consecutive
WHERE val_3_bool = 1
AND val_1_dur > 4100 AND val_1_dur < 5900
选择*
从连续
其中val_3_bool=1
val_1_dur>4100,val_1_dur<5900

现在我正在寻找这种图案最长的连续出现 对于每个
p_id
-和计数的
val_1_dur
AVG

可以用纯SQL计算吗


有窗口功能,可用于将一行与上一行和下一行进行比较


如和上所示,一种方法是采用行号差法来获得每个行的序列:

select pid, count(*) as in_a_row, sum(val1_dur) as dur
from (select t.*,
             row_number() over (partition by pid order by idx) as seqnum,
             row_number() over (partition by pid, val3_bool order by idx) as seqnum_d
      from consecutive t
     ) t
group by (seqnun - seqnum_d), pid, val3_bool;
如果您专门查找“1”值,则将
其中val3_bool=1
添加到外部查询。为了理解为什么这样做,我建议您关注子查询的结果,这样您就可以理解为什么差异定义了连续值

然后,您可以使用
上的
distinct获得最大值:

select distinct on (pid) t.*
from (select pid, count(*) as in_a_row, sum(val1_dur) as dur
      from (select t.*,
                   row_number() over (partition by pid order by idx) as seqnum,
                   row_number() over (partition by pid, val3_bool order by idx) as seqnum_d
            from consecutive t
           ) t
      group by (seqnun - seqnum_d), pid, val3_bool;
     ) t
order by pid, in_a_row desc;

上的
不需要额外的子查询级别,但我认为这使逻辑更加清晰。

将表格和数据作为文本发布,以了解为什么声音有趣。;)但我只寻找特定模式的连续匹配。@Teletubbi OSX。这正是你想要的。只需将
where
子句添加到
groupby
之前的查询中,如答案中所述。是的,它可以工作!谢谢但是这个过程有点慢。大约需要30秒。(表大小750MB)。