2

我有一个非常简单的表,类似于:

id  | val
----------
1   | 20
2   | 22
3   | 29
4   | 21
5   | 14
6   | 9
7   | 15

我希望能够识别连续行中的模式。例如,如果输入是“29, 21, 14”,则有匹配的连续三行,我想返回:

id  | val
----------
3   | 29
4   | 21
5   | 14

如果行不连续,则不匹配。

我的尝试,不起作用:

SELECT id as firstid, val from tbl100 WHERE `val` = '29' AND firstid+1 = '21' AND firstid+2 = '14'

问题显然是我的查询找到 val 29,然后查找 id 21 和 id 14,它应该查找 val 21 和 val 14,但我不知道该怎么做。

任何帮助表示赞赏!

4

1 回答 1

4

您可以先找到匹配的行,然后使用和检查顺序ids :leadlag

with m_vals as (
   select t1.* from t t1 join i t2 on t1.val = t2.val
)
select t3.id, t3.val from (select m.*, lag(m.id) over (order by m.id) l, lead(m.id) over (order by m.id) t from m_vals m) t3
where (t3.l is null or t3.l + 1 = t3.id) and (t3.t is null or t3.t - 1 = t3.id)
于 2021-10-09T00:50:57.567 回答