2011-03-22 72 views
0

我有一个数据集,其中有多个记录,代表相同实体的不同统计数据。将数据集从行转移到列奋斗

例子:

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 
... 

我已经远远超过了每十万十“指标”来自数千个时间戳的设备。

如果我可以在每个采样周期内查看设备的一条记录,那么在特定时间内查询给定设备的所有度量标准分数将更加容易。

所以,我的问题是,什么是最好的方法来处理和执行它?我不是故意要求任何人为我做我的工作,但这超出了我对数据库的了解。

+0

如果可能,我可以建议您使用与“when”不同的列名吗? (即使这只是一个例子 - 它使设置测试用例变得更加困难) – 2011-03-22 14:31:31

+0

谢谢。列名实际上不是“何时”。为了简单起见,我在这里只使用了一个元名称。 :) – 2011-03-29 21:27:31

回答

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 ...每个度量。

+0

谢谢!虽然,我不太了解'... THEN t.score ELSE 0 END)'那里发生了什么? – 2011-03-22 04:20:14

+0

爱用户名,顺便说一句。 – 2011-03-22 04:24:24

+0

@NJ:请参阅[CASE文档](http://www.postgresql.org/docs/7.4/static/functions-conditional.html) - 它就像SWITCH语句,如果您熟悉它们的话。 – 2011-03-22 04:53:42