不幸的是,我从未使用过Postgres,因此该解决方案可在MysqL中使用。但是我认为您可以找到Postgres类似物。
class Counter < ActiveRecord::Base
has_many :samples do
# default 30 minutes
def per_time_slice(slice = 30)
start = "2000-01-01 00:00:00"
self.select("*,
CONCAT( FLOOR(TIMESTAMPDIFF(MINUTE,'#{start}',created_at)/#{slice})*#{slice},
(FLOOR(TIMESTAMPDIFF(MINUTE,'#{start}',created_at)/#{slice})+1)*#{slice} ) as slice,
avg(value) as avg_value,
min(value) as min_value,
max(value) as max_value,
sum(value) as sum_value,
count(value) as count_value").
group("slice").order("slice")
end
end
end
counter = find_some_counter
samples = counter.samples.per_time_slice(60).where(:name => "Bobby")
samples.map(&:avg_value)
samples.map(&:min_value)
samples.map(&:max_value)
等等