sql - 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
吗?同样,这似乎不应该是一件奇怪的事情,时间尺度用户是否有一种常见的方法来处理这个问题?
解决方案
可以借助tablefunc 模块crosstab
中的函数重建宽表示,请参阅此回复。另一种方法是使用与列一样多的自连接,即在所描述的情况下大约为 300,这对于性能来说可能很糟糕。第一个解决方案也可能会遇到性能问题。而且这两种方法都可能不允许使用 TimescaleDB 的某些功能。
由于数据来源于宽格式,我建议以这种方式存储数据并保留原始语义,即传感器值与相同的时间戳一起出现。这也将消除重建此表示的需要。
一般来说,表示之间的选择很大程度上取决于如何查询数据。这个问题只提出了一个这样的要求。此外,最好考虑保留原始数据语义可能是值得的。
推荐阅读
- ionic-framework - IONIC 3 InAppBrowser 执行脚本
- powerbi - 在 PowerBI 中提取最后一个空格之前的文本
- c# - 如何从 python *在同一进程中运行 c# 代码*?
- python - 如何向使用 nx.shortest_path 创建的路线添加一个点?
- typo3 - 在详细视图中插入媒体图像
- sql - 出现错误 在执行 DB2 EXPORT IXF 时处理 Action String 参数中的 SELECT 字符串时出现 SQL 错误“-204”?
- excel - 将大字符串与excel中的百分比差异进行比较
- reactjs - 在 react-dates 中突出显示某些日期
- reactjs - 从 redux-saga 函数访问 React 上下文值
- angular - 从指令中创建/获取 TemplateRef