【发布时间】:2020-03-10 14:56:06
【问题描述】:
请考虑下面我的表格图片,我的问题涉及在sensor_values 列上执行UPDATE 和SELECT。
sensor_values 列是一个长度为 86,400 的数组,对应于一天中每一秒的传感器值。我现在将其设置为 JSON 数据类型。
我的问题
如何对特定索引执行UPDATE?
-
即 更改当天的第 5 秒,或将
[4]索引为值300.25
我如何SELECT 一天的前 300 秒? 下面的伪代码
SELECT sensor_values[0:299] FROM facts WHERE d_date = '2020-03-10' AND dim_tag = 'Water_Temp'
这是一个指向 PostGresql 的 DBFiddle 的链接,它做的事情与我在 MariaDB 中尝试完成的事情非常相似。 https://dbfiddle.uk/?rdbms=postgres_12&fiddle=6999d2607c48a809ff995c8844c7f7bb
编辑:下面是我的系统的高级概述
我有一个 Python 数据管道,可以读取数千个传感器的值并执行计算。它负责存储在其他表中的所有数据汇总。
我需要易于访问第二级的数据以进行分析,我正在尝试以本问题中所说的方式进行分析。我的想法是在 Python 中获取当天的第二天,并将其用作要更新的数组索引,如下所示:
now = datetime.datetime.now()
midnight = now.replace(hour=0, minute=0, second=0, microsecond=0)
secondsSinceMidnight = (now - midnight).seconds
sensorValue = 300.25
sensorTag = "Water_Temp"
sqlQuery =
"""
UPDATE facts
SET sensor_values[%s] = %s
WHERE d_date = %s AND dim_tag = %s
"""
sqlValues = secondsSinceMidnight, sensorValue, datetime.datetime.today().strftime('%Y-%m-%d'), sensorTag
dbOps.update(sqlQuery, sqlValues)
我不想整天跟踪 Python 中的值,然后执行INSERT,因为如果程序崩溃,我会丢失所有数据,并且使用 预先形成的数组 让我以编程方式快速确定程序的其他区域中缺少数据的位置(即sensor_value 是一天中的一组秒数的0)。
我使用术语预先形成的数组,因为我计划让我的程序定期检查以确保当前和第二天的每个传感器始终有一行可用,从而确保在午夜无缝转换因为颗粒很小。
正如 Bill Karwin 的回答所建议的那样,这是我的第一种方法 - 但是有数千个传感器,每个传感器都会每秒发布一次。数据库将呈指数增长:1000 * 86400 = 86.4M 每天输入的行数。
所以,它不一定是JSON,只是一个可以这种格式修改的数组。我认为这是MySQL 的正确方法。更新了帖子的标题以更好地反映问题。
【问题讨论】: