【问题标题】:Can pattern matching be used in MySQL for consecutive rows?模式匹配可以在 MySQL 中用于连续行吗?
【发布时间】:2021-11-28 19:52:42
【问题描述】:

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

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,但我不知道该怎么做。

任何帮助表示赞赏!

【问题讨论】:

  • select version(); 显示什么?
  • 所以您是专门寻找 val 29、21、14 的模式,而没有其他?是什么让行连续,id 有序,没有插入行,或其他什么?
  • 连续,因为没有插入行。我使用的是 HeidiSQL 9.5,选择 version() 显示 10.1.37-MariaDB
  • 我并不是专门寻找那个模式,它会是用户输入的任何内容,但是为了弄清楚我们可以使用该模式的查询语法。我会将用户输入放入 vars 并在查询中使用 vars。
  • 最简单的方法是使用 lag() 或 Lead() 函数,但这需要 mariadb 10.2 或 mysql 8

标签: mysql sql select pattern-matching mariadb-10.1


【解决方案1】:

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

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)

【讨论】:

  • Ajax1234,你已经超出了我的想象,但非常感谢。我将研究滞后和领先。
  • @blogo 很高兴为您提供帮助。您可能会发现 leadlag 上的 this 链接很有帮助。
猜你喜欢
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多