【问题标题】:How to pivot time series table without aggregation如何在不聚合的情况下旋转时间序列表
【发布时间】:2019-08-02 15:55:14
【问题描述】:

我正在从 Teradata 表中提取传感器数据进行分析。下面是表格的样子。

我想旋转它,使传感器名称成为列。

有超过一百个传感器,因此在枢轴之后的矩阵中有那么多列。最终结果集将非常稀疏,因为并非所有传感器都具有所有日期的值。如何在不聚合的情况下旋转表格?

【问题讨论】:

  • 如果结果非常稀疏,那将浪费内存。您是否考虑过操纵一组时间序列(每个传感器一个)而不是矩阵?如果您在拉动行的同时形成时间序列,那么您的数据将被透视。

标签: sql time-series pivot teradata


【解决方案1】:

聚合有什么问题?

select timestamp,
       max(case when sensor_id = 'sensor1' then val end) as sensor1,
       max(case when sensor_id = 'sensor2' then val end) as sensor2,
       max(case when sensor_id = 'sensor3' then val end) as sensor3,
       . . .
from t
group by timestamp;

这似乎是表达逻辑的最简单方式。它的性能可能比 100 joins 好一点。

【讨论】:

  • 如果不知道列名,则需要动态SQL,即存储过程。
  • 我最终使用了这个,但使用了一个脚本来生成 sql 字符串,因为标签太多
【解决方案2】:

你可以使用LEFT JOIN:

SELECT DISTINCT t.timestamp, t1.val AS sensor_1, t2.val AS sensor_2, t3.val as sensor_3
FROM (SELECT DISTINCT timestamp FROM tab) t
LEFT JOIN tab t1
  ON t.timestamp = t1.timestamp
  AND t1.sensor_id = 'sensor1'
LEFT JOIN tab t2
  ON t.timestamp = t2.timestamp
  AND t2.sensor_id = 'sensor2'
LEFT JOIN tab t3
  ON t.timestamp = t3.timestamp
  AND t3.sensor_id = 'sensor3'

【讨论】:

  • 我想过这个办法,但是标签有几百个。
  • @ddd 在任何方法中,您都必须预先了解列列表。其他选项是动态构建查询或在应用层中构建查询。
  • @ddd Accomplish pivot in teradata sql 您应该在问题中添加您正在寻找 dynamic PIVOT 因为它是 XY Problem 的经典示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多