Rails - 使用group by和count查询日期

时间:2012-10-01 12:46:53

标签: sql ruby-on-rails count group-by

我正试图通过商业周获得通话次数。我写过sql:

select strftime('%W', date_time_origination) as week, count(*)
from calls
group by week;

然后我尝试在rails中运行它,首先使用它:

calls_by_week = Call.select("strftime('%W',date_time_origination) as week, count(*) as total_number_of_calls").group("week")

这返回了一组具有正确数据的对象,但重复多次(json表示):

[{ "total_number_of_calls": 5435, "week": 39 },.....]

鉴于它应该返回一个对象,我尝试更改rails查询结构:

calls_by_week = Call.select("strftime('%W', date_time_origination) as week").group("strftime('%W', date_time_origination)").count

这一次,查询返回一个哈希,减去命名的参数:

{ "31": 3123, "32": 1231,... }

我希望json中的数据如下所示:

{ "week": 31, "total_number_of_calls": 12412,.....}

有没有办法消除第一个查询产生的重复?

1 个答案:

答案 0 :(得分:0)

首先:如果您使用Call.select(...) rails将尝试实例化Call个对象。你想要的不是Call对象,只是哈希。您可以使用Call.connection.execute("SELECT .... blah blah").to_enum.to_a并使用生成的数组数组。

但是要将结果转换为哈希表单,请使用

returned_hash = { "31": 3123, "32": 1231,... }
what_you_want = returned_hash.collect do |k,v|
  {"week" => k.to_i, "total_number_of_calls" => v.to_i}
end

另一种方法是使用.uniq应用于查询,它仍然会构建Call个对象,但至少它们不会有重复的数据。