Sql 如何在没有聚合的情况下透视时间序列表

Sql 如何在没有聚合的情况下透视时间序列表,sql,time-series,pivot,teradata,Sql,Time Series,Pivot,Teradata,我从Teradata表中提取传感器数据进行分析。下面是这张桌子的样子。 我想将其旋转,使传感器名称成为列。 有一百多个传感器,因此枢轴后矩阵中有许多列。最终结果集将非常稀疏,因为并非所有传感器都具有所有日期的值。如何在没有聚合的情况下透视表?您可以使用左JOIN: SELECT DISTINCT t.timestamp, t1.val AS sensor_1, t2.val AS sensor_2, t3.val as sensor_3 FROM (SELECT DISTINCT times

我从Teradata表中提取传感器数据进行分析。下面是这张桌子的样子。

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


有一百多个传感器,因此枢轴后矩阵中有许多列。最终结果集将非常稀疏,因为并非所有传感器都具有所有日期的值。如何在没有聚合的情况下透视表?

您可以使用
左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'
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;

您可以使用左联接:

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'

聚合有什么问题

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
join
s稍好一些。

聚合有什么问题

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
join
s好一点。

我考虑过这种方法,但有数百个标记。@ddd在任何方法中,您都必须事先知道列列表。其他选项是动态生成查询或在应用程序层中生成查询。@ddd您应该在问题中添加您正在寻找的动态透视,因为这是我考虑过的这种方法的典型示例,但有数百个标记。@ddd在任何方法中,您都必须事先知道列列表。其他选项是动态生成查询或在应用程序层中生成查询。@ddd您应该在问题中添加您正在查找的动态透视,因为这是一个典型的示例,如果您不知道列名,则需要动态SQL,这意味着一个存储过程。我最终使用了这个过程,但使用了一个脚本来生成sql字符串,因为有太多的标记如果你不知道列名,那么你需要动态sql,这意味着一个存储过程。我最终使用了这个过程,但使用了一个脚本来生成sql字符串,因为有太多的标记。如果结果非常稀疏,这将浪费内存。您是否考虑过使用一组时间序列(每个传感器一个)而不是矩阵?如果您在提取行的同时形成时间序列,那么您的数据将进行数据透视。如果结果非常稀疏,则会浪费内存。您是否考虑过使用一组时间序列(每个传感器一个)而不是矩阵?如果您在提取行的同时形成时间序列,那么您的数据将进行数据透视。