首页 > 解决方案 > 根据之前的行生成列值

问题描述

一个按时间和值排序的表,我想添加一个名为 Keep 的列,它表示要保留哪一行。每行的保持列为 0 或 1。

保持连续的标准:

  1. 如果每行与上一行之间的时间大于5分钟,则保留这一行;如果当前行的值与前一行不同,则保留该行。(保持 = 1)

  2. 如果上一行和这一行之间的时间小于5分钟,并且值相同,则将其标记为0作为保留列。下一行不会使用当前行计算时差,它会使用上一行。

输出示例:

+--------+-------+------+
|  Time  | Value | Keep |
+--------+-------+------+
| 11:34  |   150 |    1 |
| 11:35  |   150 |    0 |
| 11:40  |   150 |    1 |
| 11:40  |   151 |    1 |
| 11:41  |   151 |    0 |
| 11:43  |   152 |    1 |
| 11:44  |   152 |    0 |
| 11:50  |   152 |    1 |
+--------+-------+------+

标签: mysqlsql

解决方案


一种方法使用相关子查询:

select t.*,
       (exists (select 1
                from t t2
                where t2.time < t.time and t2.time >= t.time - interval 5 minute and
                      t2.value = t.value
       ) as keep
from t;

推荐阅读