Sql 组合活动记录组、加入、最大值和;最低限度

Sql 组合活动记录组、加入、最大值和;最低限度,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我正在努力掌握活动记录查询界面。我有两种型号: class Movie < ActiveRecord::Base has_many :datapoints attr_accessible :genre end class Datapoint < ActiveRecord::Base belongs_to :movie attr_accessible :cumulative_downloads, :timestamp end 这样,我就可以计算每部电影的增量

我正在努力掌握活动记录查询界面。我有两种型号:

class Movie < ActiveRecord::Base
  has_many :datapoints
  attr_accessible :genre
end

class Datapoint < ActiveRecord::Base  
  belongs_to :movie  
  attr_accessible :cumulative_downloads, :timestamp
end
这样,我就可以计算每部电影的增量,然后再将其聚合为每种类型的增量

显然,这有点笨拙,我相信一步就可以做到(并且使用散列条件)。我就是不知道该怎么做。你能帮忙吗

非常感谢


德里克。

我认为这将允许您计算每种类型的最大值:

Movie.joins(:datapoints).where(datapoints: {timestamp: (Time.now)..(Time.now+1.year)}).group(:genre).maximum(:cumulative_downloads)
编辑1

您可以通过几个步骤获得差异:

rel = Movie.joins(:datapoints).where(datapoints: {timestamp: (Time.now)..(Time.now+1.year)}).group(:genre)
mins = rel.minimum(:cumulative_downloads)
maxs = rel.maximum(:cumulative_downloads)
res = {}
maxs.each{|k,v| res[k] = v-mins[k]}
编辑2

你最初的方向就快到了。您所要做的就是在SQL中计算每部电影的差异,并准备好数据,以便一次就可以收集到它。我确信有一种方法可以在SQL中完成这一切,但我不确定它是否会如此简单

# get the genre and diff per movie
result = Movie.select('movies.genre, MAX(datapoints.cumulative_downloads)-MIN(datapoints.cumulative_downloads) as diff').joins(:datapoints).group(:movie_id) 
# sum the diffs per genre
per_genre = Hash.new(0)
result.each{|m| per_genre[m.genre] += m.diff}
编辑3

包括选择中的电影id和组中的流派:

# get the genre and diff per movie
result = Movie
    .select('movies.movie_id, movies.genre, MAX(datapoints.cumulative_downloads)-MIN(datapoints.cumulative_downloads) as diff')
    .joins(:datapoints)
    .group('movies.movie_id, movies.genre') 
# sum the diffs per genre
per_genre = Hash.new(0)
result.each{|m| per_genre[m.genre] += m.diff}

谢谢你的帮助。我真正想要的是在给定时间段内每种类型的增量下载。i、 e开始和结束之间累积总数的差异。你知道有没有办法做到这一点吗?我希望我达到了你想要达到的目标。我不知道如何用一个查询来完成它。请看我上面的两个编辑。我在这里学习,这真的很有帮助。然而,这并不是我所需要的结果。目前,它返回一个类型中所有单个电影的最小/最大值。然而,我要做的是计算在一个时间范围内每种类型的增量下载量。这可能是通过1)计算每部电影的最小(开始)下载量2)将它们相加,以获得该类型电影的最小(开始)下载量3)对最大值执行相同操作,4)找出每种类型电影的差异。另一种方法可能是按类型对每部电影的增量视图求和。非常感谢你的帮助!你能再解释一下语义吗?datapoint在您的上下文中是什么意思?datapoint的累积下载是什么意思?datapoint是来自第三方的关于某个时间点电影的累积下载的信息。希望这有帮助。
# get the genre and diff per movie
result = Movie
    .select('movies.movie_id, movies.genre, MAX(datapoints.cumulative_downloads)-MIN(datapoints.cumulative_downloads) as diff')
    .joins(:datapoints)
    .group('movies.movie_id, movies.genre') 
# sum the diffs per genre
per_genre = Hash.new(0)
result.each{|m| per_genre[m.genre] += m.diff}