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