【问题标题】:Group by two columns, to get uniq result按两列分组,以获得 uniq 结果
【发布时间】:2013-11-18 18:18:32
【问题描述】:

我想将一个表中的结果按两列分组:created_atp_id,我需要按 p_id 分组,因为我需要唯一值,我尝试使用 distinct 来做到这一点但在我的情况下并没有按照我想要的方式工作。

Report.group("date(created_at)").group(:p_id).select("date(created_at) as created_at, count(*) as count, p_id")

r = _
r.count will generate this:
{[Mon, 18 Nov 2013, 11]=>1, [Mon, 18 Nov 2013, 8]=>1, [Mon, 18 Nov 2013, 13]=>1, [Mon, 18   Nov 2013, 12]=>3, [Mon, 18 Nov 2013, 10]=>1, [Mon, 18 Nov 2013, 7]=>1, [Mon, 18 Nov 2013, 3]=>1, [Mon, 18 Nov 2013, 2]=>1, [Mon, 18 Nov 2013, 9]=>1, [Mon, 18 Nov 2013, 14]=>1, [Mon, 18 Nov 2013, 6]=>1}

但我需要不同格式的结果,我应该添加什么才能得到这样的结果:{Mon, 18 Nov 2013=>11} 其中11 是上述 sql 语句生成的记录总数。

谢谢。

【问题讨论】:

  • 我不明白你的问题。请提供一个更好的例子。
  • 您按p_id 分组,然后您想按相同的值取消分组?为什么不直接删除group(:p_id) 调用?
  • 我编辑了我的问题,并且很清楚,我想做的是每天获取唯一 p_ids` 的总数。

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-4 rails-postgresql


【解决方案1】:

如果您只想计算日期出现在结果中的次数,可以通过简单的 ruby​​ 代码来完成:

result = result.inject ({}) do |hash, el| 
  hash[el[0][0]] ||= 0
  hash[el[0][0]] += 1
  hash
}

假设结果是这样的:

{[date1, a] => b, [date1, c] => d, [date2, e] => f}

你会得到

{date1 => 2, date2 => 1}

如果您想获取与日期相关的 count(*) 值,请将 sum 调用更改为:

hash[el[0][0]] += el[1]

在这种情况下,你会得到:

{date1 => b+d, date2 => f}

【讨论】:

  • 我的结果与您的假设一样,但仍然无法正常工作。这是我运行上述 SQL 查询的结果,[#<Report id: nil, p_id: 32, created_at: "2013-11-19">, #<Report id: nil, p_id: 43, created_at: "2013-11-19">, #<Report id: nil, p_id: 10, created_at: "2013-11-19">... 如何按日期再次对它们进行分组并计算它们?我认为这将是一个简单的解决方案。
  • 您能否说明您从Report.group... 行获得的对象?您在此处写的内容与您在问题中表达的内容不同。
  • 我写的是运行查询时得到的结果,我在问题中写的是如果对该查询执行count 得到的结果。
  • 好吧,然后设置result = Report.group ... .count 并尝试我的代码。它应该可以工作。
  • 天啊,我做了 100 次,还是不行,现在可以了,谢谢。
猜你喜欢
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 2021-03-31
  • 2021-02-24
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多