TimescaleDB - 创建一个“透视视图”,其中所有传感器值对应于一行上的特定时间戳

Posted

技术标签:

【中文标题】TimescaleDB - 创建一个“透视视图”,其中所有传感器值对应于一行上的特定时间戳【英文标题】:TimescaleDB - Create a 'pivoted view' with all sensor values corresponding to a particular timestamp on one row 【发布时间】:2021-12-01 09:54:05 【问题描述】:

我是 TimescaleDB 和一般关系数据库的新手。

表格中有数据

Timestamp Sensor name 1 Sensor name2 ... Sensor name 300
yyyy-mm-dd 00:01 22.5 25 ... sensor 300 value
yyyy-mm-dd 00:02 ...

但由于我想在第二个表中存储有关每个传感器(位置、类型等)的元数据,因此我将其存储在 TimescaleDB 中

timestamp sensor_id value
yyyy-mm-dd 00:01 1 22.5
yyyy-mm-dd 00:01 2 25

这很好,虽然我不喜欢将时间戳重复 300 次。

但是,我需要一个以原始形式返回数据的查询,每个唯一时间戳一行,传感器名称(来自第二个表)作为列。我觉得这对这种数据来说一定是一个非常正常的操作,但我这辈子都不知道该怎么做。

所以有两个问题:这实际上是在 TimescaleDB 中存储此类数据的好方法吗?从我在文档中可以看到,数据的原始形式是“宽表”,我可以像这样存储它,但是我不知道如何将元数据链接到各个列。我现在存储它的方式是一个“窄表”,但是我需要一种方法来重建“宽”表格。 Timescale 中是否有首选方法?

如何构造查询以获取原始“宽”形式的数据?它本质上是一个支点,所以我会使用crosstab 吗?同样,这似乎不应该是一件奇怪的事情,时间尺度用户是否有一种常见的方法来处理这个问题?

【问题讨论】:

如果您要使用time_bucket 函数按某个时间范围对数据进行分组,您可以重复使用它来加入。问题是:如果您总是需要汇总数据,也许值得将它们保存在同一张表中。 【参考方案1】:

可以在tablefunc module 的crosstab 函数的帮助下重建宽表示,请参阅this reply。另一种方法是使用与列一样多的自连接,即在所描述的情况下大约有 300 个,这对于性能来说可能很糟糕。第一个解决方案也可能会遇到性能问题。而且这两种方法都可能不允许使用 TimescaleDB 的某些功能。

由于数据来源于宽格式,我建议以这种方式存储数据并保留原始语义,即传感器值与相同的时间戳一起出现。这也将消除重建此表示的需要。

通常,表示之间的选择很大程度上取决于查询数据的方式。这个问题只提出了一个这样的要求。此外,最好考虑保留原始数据语义。

【讨论】:

以上是关于TimescaleDB - 创建一个“透视视图”,其中所有传感器值对应于一行上的特定时间戳的主要内容,如果未能解决你的问题,请参考以下文章

TimescaleDB:具有追加与中点插入和索引的超表的性能

什么是透视图?

快速入门:Java 连接使用 时序数据库 TimescaleDB

快速入门:Java 连接使用 时序数据库 TimescaleDB

第九周access课总结

Unity3D正交视图与透视视图 ( 正交视图概念 | 透视视图概念 | 观察点 | 正交视图作用 | 摄像机广角设定 | 透视畸变效果 )