可以在 MySQL 中对连续行使用模式匹配吗?
Can pattern matching be used in MySQL for consecutive rows?
我有一个很简单的table,类似于:
id | val
----------
1 | 20
2 | 22
3 | 29
4 | 21
5 | 14
6 | 9
7 | 15
我希望能够识别连续行中的模式。比如输入“29,21,14”,有连续三行匹配,我想return:
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,但我不知道该怎么做。
感谢任何帮助!
您可以先找到匹配的行,然后使用 lead
和 lag
:
检查连续的 id
s
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)
我有一个很简单的table,类似于:
id | val
----------
1 | 20
2 | 22
3 | 29
4 | 21
5 | 14
6 | 9
7 | 15
我希望能够识别连续行中的模式。比如输入“29,21,14”,有连续三行匹配,我想return:
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,但我不知道该怎么做。
感谢任何帮助!
您可以先找到匹配的行,然后使用 lead
和 lag
:
id
s
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)