2014-03-24 86 views
0

我试图在4小时内获得一些数据的平均值,我的应用程序位于Ruby on Rails中,所以我不知道应该写PostgreSQL查询还是要做它在应用程序的模型中,也不知道我会怎么做。 模型的简单的版本是这样的:按4小时间隔分组

id heart_rate timestamp 

我还需要1小时,1天的间隔,但我已经知道该怎么做,SQL一边至少:

SELECT AVG(heart_rate), to_char(timestamp, 'YYYY-MM-DD') AS ts 
FROM vital_signs 
GROUP BY ts 
ORDER BY ts ASC; 
+1

4小时,开始在哪里? 00:00?那么00:00,04:00,08:00? – Roger

+0

@罗杰尔是,00-04,04-08,08-12,12-04,04-08,08-00, –

回答

0

尝试用:

MyModel.select("(CASE 
    WHEN hour(created_at) < 4 then '00-04' 
    WHEN hour(created_at) >= 4 and hour(created_at) < 8 then '04-08' 
    WHEN hour(created_at) >= 8 and hour(created_at) < 12 then '08-12' 
    WHEN hour(created_at) >= 12 and hour(created_at) < 16 then '12-16' 
    WHEN hour(created_at) >= 16 and hour(created_at) < 20 then '16-20' 
    ELSE '20-24' END) AS delta, 
    count(*) as qty"). 
group("delta") 

或者干脆:

ActiveRecord::Base.connection.execute("SELECT (CASE 
    WHEN hour(created_at) < 4 then '00-04' 
    WHEN hour(created_at) >= 4 and hour(created_at) < 8 then '04-08' 
    WHEN hour(created_at) >= 8 and hour(created_at) < 12 then '08-12' 
    WHEN hour(created_at) >= 12 and hour(created_at) < 16 then '12-16' 
    WHEN hour(created_at) >= 16 and hour(created_at) < 20 then '16-20' 
    ELSE '20-24' END) AS delta, 
    count(*) as qty 
    FROM my_table 
    group by delta;") 

但这个想法是让你的数据库引擎处理分组,而不是尝试在ruby代码中做类似的事情。

1

24小时/ 4 = 6段。

将您的日期转换为小时,然后做一个整数除法(DIV)。这会给你0-5号码。每个余数代表一个段。

这个例子是针对MySQL(而不是Rails),用Postgress等效替换DIV(MySQL的Integer除法函数)。

SELECT 
    AVG(heart_rate), HOUR(timestamp) DIV 4, COUNT(*) 
FROM 
    vital_signs 
GROUP BY 
    DATE(timestamp), 
    HOUR(timestamp) DIV 4; 

你可以分组在日期分开,所以每天你得到平均。结果。

您可以在Rails的直接执行SQL通过:

ActiveRecord::Base.connection.execute "<sql>" 
1

模拟数学余数是一个不错的选择,因为:

Model.count(group: 'CAST((24 - hour(table.created_at))/4 as UNSIGNED)') 

它会给你每组的四个数的散列小时为

{0=>2, 1=>1, 3=>1, 6=>2} 

6代表开始时间0:00至4:00等

可以使用获得平均如下:

Model.average(:field ,group: 'CAST((24 - hour(table.created_at))/4 as UNSIGNED)') 
+0

但我需要那些时间范围内的平均值,而不是有多少 –

+0

Model.average(:heart_rate ,组:'CAST((24小时(table.created_at))/ 4作为UNSIGNED)') – Kimooz