【问题标题】:Must appear in Group By clause or used in agg. function必须出现在 Group By 子句中或在 agg 中使用。功能
【发布时间】:2018-11-05 15:05:39
【问题描述】:

我有一个很大的用户表,我正在尝试按街道对城镇内的所有用户进行分组,并通过 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']}

【问题讨论】:

  • 您要么必须更改 SQL 查询,要么可能直接使用 Ruby 代码转换地图。
  • 是的,我认为通过 Ruby 进行迭代可能是唯一的选择,但我希望避免这种情况,因为结果集可能很大。

标签: ruby-on-rails postgresql


【解决方案1】:

您可以使用 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']] }

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

【讨论】:

  • 感谢您的帮助,我也不认为有一种好方法可以一次性从数据库中获取它。只需将右括号添加到“[vals.second, count”。再次感谢
猜你喜欢
  • 2016-04-03
  • 2013-11-05
  • 2016-05-26
  • 1970-01-01
  • 2013-08-06
  • 2015-08-14
  • 2018-05-16
相关资源
最近更新 更多