当前位置: 首页 > 面试题库 >

如何使用SQL有效地确定行之间的更改

山阳辉
2023-03-14
问题内容

我有一个非常大的MySQL表,其中包含从多个传感器读取的数据。本质上,这里有一个时间戳和一个值列。我将省略传感器ID,在此处为其他详细信息编制索引:

CREATE TABLE `data` (
  `time` datetime NOT NULL,
  `value` float NOT NULL
)

value列很少改变,我需要找点时间,当发生这些变化。假设每分钟都有一个值,以下查询恰好返回了我需要的值:

SELECT d.*, 
  (SELECT value FROM data WHERE time<d.time ORDER by time DESC limit 1) 
    AS previous_value 
FROM data d 
HAVING d.value<>previous_value OR previous_value IS NULL;

+---------------------+-------+----------------+
| time                | value | previous_value |
+---------------------+-------+----------------+
| 2011-05-23 16:05:00 |     1 |           NULL |
| 2011-05-23 16:09:00 |     2 |              1 |
| 2011-05-23 16:11:00 |   2.5 |              2 |
+---------------------+-------+----------------+

唯一的问题是,这是非常低效的,主要是由于依赖子查询。使用MySQL 5.1必须提供的工具来对此进行优化的最佳方法是什么?

最后一个约束是,在将值插入数据表之前不对它们进行排序,并且可能在以后更新它们。这可能会影响任何可能的非规范化策略。


问题答案:

您可以尝试一下-我不保证它的性能会更好,但这是我通常将行与“上一个”行相关联的方式:

SELECT
    * --TODO, list columns
FROM
    data d
       left join
    data d_prev
       on
           d_prev.time < d.time --TODO - Other key columns?
       left join
    data d_inter
       on
           d_inter.time < d.time and
           d_prev.time < d_inter.time --TODO - Other key columns?
WHERE
    d_inter.time is null AND
    (d_prev.value is null OR d_prev.value <> d.value)

(我认为这是正确的-可以使用一些样本数据来对其进行验证)。

基本上,这种想法是将表与其自身连接起来,并针对“上一个”行的每一行(在中d)找到候选行(在中d_prev)。然后进行进一步的联接,以尝试找到d_inter存在于当前行(in
d)和候选行(in d_prev)之间的行(in )。如果我们找不到这样的行(d_inter.time is null),则该候选项确实是前一行。



 类似资料:
  • 我知道如果我首先对多边形进行三角剖分,那么我就可以轻松可靠地检查任何三角形的面······但问题是我的三角剖分库要求知道平面正常。所以,先有蛋后有鸡。 我如何在一个非凸多边形中选择两条边(或三个顶点)来可靠地定义多边形的朝向?

  • 问题内容: 我想知道是否可以使用select语句检索行的确切位置。例如235和250之间的行。这可能吗? 预先感谢,shashi 问题答案: 我们可以通过多种方式做到这一点。 我们可以借助offset-fetch子句来完成。 它将获取235-250之间的记录。因为它会跳过前234行,然后再获取下16行。 我们可以将简单的select语句与where子句一起使用。 它也将获取相同的结果。 希望它会有

  • 问题内容: 在Golang中,我正在寻找一种有效的方法来确定文件的行数。 当然,我总是可以遍历整个文件,但效率似乎并不高。 有没有一种更好的方法(更快,更便宜)来找出文件有多少行? 问题答案: 这是用于查找换行符的更快的行计数器。 它之所以更快,是因为它消除了返回整行所需的所有额外逻辑和缓冲,并利用了字节包提供的某些程序集优化功能来搜索字节片中的字符。 较大的缓冲区在这里也有帮助,尤其是对于较大的

  • 问题内容: 我想知道是否有可能在SAS中使用proc sql从宽有效地转换成长有效。 我知道proc换位比我在下面建议的方法要快得多。但是我的目标之一是避免存储转置表。 例如,假设我有table1作为 我想把它变成 我可以做到这一点; 选择id,’A’作为col1,A作为 来自table1的col2 , 其中A〜=“” 联合选择id,’B’作为col1,B作为 来自table1的col2 , 其中

  • 产品用例——我们的产品有一个典型的用例,我们将有n个用户。每个用户将有n个工作流,每个工作流可以在任何时间运行(n次)。 我希望这是任何工作流产品的典型用例。 我可以使用域来区分用户吗(我的意思是说为每个用户创建一个域)? 我可以为每个用户创建一个WorkflowClient来服务他所有的工作流执行吗?或者对于每个请求,我需要创建一个工作流客户端吗?哪一个是推荐的方法? 创建工作对象以轮询任务列表

  • 问题内容: 我想知道是否有更优雅的方法来使用Spring的JDBCTemplate进行IN()查询。目前,我正在执行以下操作: 这是很痛苦的,因为如果我只有九行用于构建IN()查询的子句。我想要类似预准备语句的参数替换 问题答案: 你需要一个参数源: 仅当返回类型的实例时,此方法才有效NamedParameterJdbcTemplate