老问题,但无论如何:我在 Ruby on Rails 中伪造了类似的东西。就我的目的而言,它运作良好。
def self.yearstats(attr)
# Determine number of columns
minyear = self.select("strftime('%Y', min(recorded_at)) AS minyear").first.minyear.to_i
maxyear = self.select("strftime('%Y', max(recorded_at)) AS maxyear").first.maxyear.to_i
# Stitch SQL query. Use explicit same column name to not confuse Rails' typecasting.
select_str = ["strftime('#{minyear}/%m/%d %H:%m', recorded_at) AS recorded_at"]
(minyear..maxyear).to_a.each do |y|
# avg because the table might have multiple rows per day
select_str += ["avg(case when strftime('%Y', recorded_at)='#{y}' then #{attr} end) AS value#{y}"]
end
self.select(select_str.join(",")).group("strftime('%m/%d', recorded_at)").all.collect {|row|
[row.recorded_at.utc.to_i*1000] + (minyear..maxyear).to_a.collect { |y| row.send("value#{y}") }
}
end
请注意,对于第一列,我使用了固定第一年的(假)日期,以便我的绘图程序获得“真实”日期,而不仅仅是日/月显示。这有点脏,但它适用于我的目的。(仍然欢迎改进......)
而不是获取minyear
and maxyear
,您可能想要执行 SELECT DISTINCT.. 来获取唯一的类别列表并适当地修改代码。