挣扎着将数据集从行转移到列

时间:2011-03-22 02:42:23

标签: sql postgresql pivot

我有一个数据集,其中包含代表相同实体的不同统计数据的多个记录。

示例:

DEVICE  METRIC           SCORE   WHEN
-------------------------------------------------
devA    reads_per_sec    100    2011-03-01 12:00:00 AM
devA    writes_per_sec   50     2011-03-01 12:00:00 AM
devA    total_per_sec    150    2011-03-01 12:00:00 AM
devB    reads_per_sec    200    2011-03-01 12:00:00 AM
devB    writes_per_sec   50     2011-03-01 12:00:00 AM
devB    total_per_sec    250    2011-03-01 12:00:00 AM
devC    reads_per_sec    300    2011-03-01 12:00:00 AM
...

我想将此表中的所有内容转移到具有此结构的新表

DEVICE  READS  WRITES  TOTAL  WHEN
--------------------------------------------------
devA    100    50      150    2011-03-01 12:00:00 AM
devB    200    50      250    2011-03-01 12:00:00 AM
devC    300    50      150    2011-03-01 12:00:00 AM
...

我为数以千计的时间戳中的每一个设备提供了十几个“指标”。

如果我可以查看每个采样周期的设备的一条记录,查询给定设备的所有度量标准得分会容易得多。

所以,我的问题是,采用这种方法并执行它的最佳方法是什么?我并不是要求任何人为我做我的工作,但这超出了我对数据库的了解。

1 个答案:

答案 0 :(得分:3)

这将重现您列出的预期结果:

  SELECT t.device,
         SUM(CASE WHEN t.metric = 'reads_per_sec' THEN t.score ELSE 0 END) AS reads,
         SUM(CASE WHEN t.metric = 'writes_per_sec' THEN t.score ELSE 0 END) AS writes,
         SUM(CASE WHEN t.metric = 'total_per_sec' THEN t.score ELSE 0 END) AS total,
         t.when
    FROM YOUR_TABLE t
GROUP BY t.device, t.when
ORDER BY t.device, t.when

如果您需要处理各种指标,则可能需要使用dynamic SQL。您需要获取唯一的度量标准值列表(除非您有外键引用的类型代码表):

SELECT DISTINCT t.metric
  FROM YOUR_TABLE t

然后,在执行查询之前,为每个指标连接SUM(CASE ...