2016-11-11 59 views
1

我有一个表datavalue与数据几乎一年的每client在间隔eventtime 15分钟。我想创建另一个表datavalue_by_hour,我将以1小时的间隔存储datavalue的数据。为此我需要:高效的查询来计算和计算卡桑德拉的平均值

  1. 获取截然不同的值为clienteventhour;
  2. 对于上述结果的每一行,计算clienteventhouravg(activepower);
  3. 计算以上平均函数中使用的activepower值的数量。

问题是,在mysql或postgres中,这可以通过几乎一条指令轻松完成。有了卡桑德拉我想唯一的方法是通过循环遍历每个结果并应用另一个查询,直到达到最终结果。这看起来效率很低,有没有其他方式可以更高效地实现这样的结构?

AFH0AEE00A0BHC 2016-05-24 18:00:00+0000 0.067 4 
AFH0AEE00AGCEC 2016-05-24 19:00:00+0000 0.081 4 
AFH0ADE0ACDAAE 2016-05-24 20:00:00+0000 0.068 3 
AFH0AEE00AGFEC 2016-05-24 21:00:00+0000 0.032 4 

我最初datavalue表有这样的结构:

CREATE TABLE datavalue (
client text, 
eventhour bigint, 
eventtime timestamp, 
activepower double, 
activepowerclassification double, 
dstoffset double, 
PRIMARY KEY ((pt, eventhour), eventtime)); 

而且在datavalue表中的数据集的例子(千万行):

AFH0AEE00BFEFB 1473847200 2016-09-14 10:00:00+0000 0.042 0.0 1.0 
AFH0AEE00BFEFB 1473847200 2016-09-14 10:15:00+0000 0.056 0.0 1.0 
AFH0AEE00BFEFB 1473847200 2016-09-14 10:30:00+0000 0.075 0.0 1.0 
AFH0AEE00BFEFB 1473847200 2016-09-14 10:45:00+0000 0.102 0.0 1.0 
A0C0AEAFIFEAHE 1472882400 2016-09-03 06:00:00+0000 0.0 0.0 1.0 
A0C0AEAFIFEAHE 1472882400 2016-09-03 06:15:00+0000 0.0 0.0 1.0 
A0C0AEAFIFEAHE 1472882400 2016-09-03 06:30:00+0000 0.0 0.0 1.0 
A0C0AEAFIFEAHE 1472882400 2016-09-03 06:45:00+0000 0.0 0.0 1.0 
AFH0ACFB00CD0F 1452693600 2016-01-13 14:00:00+0000 0.244 0.0 0.0 
AFH0ACFB00CD0F 1452693600 2016-01-13 14:15:00+0000 0.244 0.0 0.0 
AFH0ACFB00CD0F 1452693600 2016-01-13 14:30:00+0000 0.242 0.0 0.0 
AFH0ACFB00CD0F 1452693600 2016-01-13 14:45:00+0000 0.244 0.0 0.0 
A0C0AEAFIEE0DC 1466319600 2016-06-19 07:00:00+0000 0.036 0.0 1.0 

回答

1

更新架构添加dstCount ,dstSum和dstAvg:

CREATE TABLE datavalue (
    client text, 
    eventhour bigint, 
    eventtime timestamp, 
    activepower double, 
    activepowerclassification double, 
    dstoffset double, 
    powerCount bigint static, 
    powerSum double static, 
    powerAvg double static, 
PRIMARY KEY ((client, eventhour), eventtime)); 

我已经使用静态列,这里是文档

静态列是由同一个分区中的所有行共享的专栏。我们举一个例子:假设我们要存储需要支付的每用户账单,并保持每用户余额需要支付的金额。我们要保持不变的是,平衡始终是所有未付账单的总和:

插入新记录使用此查询来选择特定的客户端当前powerCount和powerSum之前和eventhour

让你正在插入记录

client   eventhour eventtime     activepower     
AFH0AEE00BFEFB 1473847200 2016-09-14 10:00:00+0000 0.040 

查询将被

SELECT powerCount,powerSum 
    FROM datavalue 
WHERE client = 'AFH0AEE00BFEFB' AND eventhour = 1473847200 LIMIT 1; 

现在你当前的powerCount和powerSum 让powerCount = 4 and powerSum = 0.275
所以更新的数据

powerSum = powerSum + 0.040 = 0.315 
powerCount = powerCount + 1 = 5 
powerAvg = powerSum/powerCount = 0.063 

现在,利用新powerSum沿插入记录,powerCount和powerAvg

+0

似乎不错!我会尝试应用这个并让你知道结果!非常感谢 –

+0

试试这个,让我知道 –