必须出现在Group By子句中或在agg中使用。功能

时间:2018-11-05 15:05:40

标签: ruby-on-rails postgresql

我有一个很大的用户表,我试图按街道将一个镇内的所有用户分组,并通过postgres和rails进行计数。以下内容为我提供了正确的数据,但是我想知道是否可以获得更好的输出:

User.group(:town,:street).count ###Gives a large hash of key/value pairs with town_name repeated each time for every grouped street like {['TOWN_NAME', 'STREET_NAME']=>'#ofUsers'}

所以代替这个:{['BETHPAGE', 'JACKSON AVE']=>372, ['BETHPAGE', 'WILLIAM ST']=>28}

我想要{ 'BETHPAGE'=>{['JACKSON', 372],['WILLIAM ST', 28]} }

是否有一个更好的查询,该查询将以TOWN_NAME一次用作键的格式输出此信息,并且每条街道及其计数均以数组形式给出:

{ 'TOWN_NAME' => {['STREET_NAME', '#ofUsers'], ['STREET_NAME', '#ofUsers']}

1 个答案:

答案 0 :(得分:0)

您可以使用ruby将其分组

original = User.group(:town, :street).count
grouped = original.group_by { |vals, count| vals[0] }
grouped.each do |town, matches| 
  grouped[town] = matches.map { |vals, count| [vals.second, count] }
end

grouped # => { 'TOWN_NAME' => [['STREET_NAME', '#ofUsers'], ['STREET_NAME', '#ofUsers']] }

我一直在寻找一种在普通查询中执行此操作的方法,但是您需要多次调用数据库。