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

问题描述

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

我有表格中的数据

时间戳 传感器名称 1 传感器名称2 ... 传感器名称 300
yyyy-mm-dd 00:01 22.5 25 ... 传感器 300 值
yyyy-mm-dd 00:02 ...

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

时间戳 sensor_id 价值
yyyy-mm-dd 00:01 1 22.5
yyyy-mm-dd 00:01 2 25

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

但是,我需要一个查询,它将以原始形式返回数据,每个唯一时间戳一行,传感器名称(来自第二个表)作为列。我觉得这对这种数据来说一定是非常正常的操作,但我终生无法找到如何去做。

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

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

标签: sqlpostgresqltime-seriestimescaledb

解决方案


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

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

一般来说,表示之间的选择很大程度上取决于如何查询数据。这个问题只提出了一个这样的要求。此外,最好考虑保留原始数据语义可能是值得的。


推荐阅读