查找连续模式(使用SQL)
PostgreSQL中的表查找连续模式(使用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
连续:
每个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)。