【问题标题】:Extracting rows with a consecutive pattern that exceeds a threshold提取具有超过阈值的连续模式的行
【发布时间】:2021-10-31 04:41:09
【问题描述】:

我目前有这组数据。

Id pattern
1 1
2 2
3 1
4 2
5 3
6 4
7 1
8 2
9 1
10 2
11 3

我有一个按升序排列的 ID,以及一个名为模式的列。目标是仅检索表中连续模式 >=3 的行。

所以结果是:

Id pattern
3 1
4 2
5 3
6 4
9 1
10 2
11 3

由于 ID 3-6 的模式已连续达到 >=3,我们将返回这 4 行。 ID 9-11 也是如此。

Id 1-2 未达到阈值 3。Id 7-8 也是如此。

不胜感激!

【问题讨论】:

  • 这必须在 MySQL 中完成吗?听起来在您的代码/应用程序中执行此操作比在数据库中更容易。
  • 是的。现在只寻找mysql解决方案。我同意如果我使用 python 或 smth 可能会更容易,但这是给我的一个数据库问题

标签: mysql window-functions correlated-subquery


【解决方案1】:

使用SUM() 窗口函数创建序列组,并使用MAX() 窗口函数检查每个组中的最大模式:

SELECT Id, pattern
FROM (
  SELECT *, MAX(pattern) OVER (PARTITION BY grp) max_pattern
  FROM (
    SELECT *, SUM(pattern = 1) OVER (ORDER BY Id) grp
    FROM tablename
  ) t
) t
WHERE max_pattern >= 3;

或者,对于不支持窗口函数的 MySql 版本,使用相关子查询:

SELECT t1.*
FROM tablename t1
WHERE (SELECT t2.pattern FROM tablename t2 WHERE t2.Id = t1.Id + (3 - t1.pattern)) = 3; 

请参阅demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 2019-11-06
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2021-02-26
    相关资源
    最近更新 更多