mysql - 根据之前的行生成列值
问题描述
一个按时间和值排序的表,我想添加一个名为 Keep 的列,它表示要保留哪一行。每行的保持列为 0 或 1。
保持连续的标准:
如果每行与上一行之间的时间大于5分钟,则保留这一行;如果当前行的值与前一行不同,则保留该行。(保持 = 1)
如果上一行和这一行之间的时间小于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 |
+--------+-------+------+
解决方案
一种方法使用相关子查询:
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;
推荐阅读
- ruby-on-rails - 如何使用 Swagger Block on Rails 设置参数组中所需的单个参数?
- node.js - 将 mediarecorder blob 转换为谷歌语音到文本可以转录的类型
- javascript - 如何在 Rollup 中配置从多个输入文件仅生成单个输出文件?
- solidity - 如何使用 web3 库发送 ERC20 令牌
- php - 从来自 Oracle12c db 的日期中删除字符串
- php - 如何处理 PHP 中所有用户的全局变量相同?
- sql-server - 在 SQL 中将 CHAR 转换为 NUMERIC
- c# - GenericHost 应用程序中的 IApplicationBuilder(asp.net core) 等价物是什么?
- sql-server-2008 - 当 SQL Server 中的列数据类型为数字时,为空或空值时获取 0,否则为 max(id)
- apache-nifi - 将avro转换为json时出现NiFi异常