Rails:每个特定列组合仅一次求和

时间:2016-09-18 20:49:27

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

我有这种表:

dated       category_id  policy_id  available
2016-01-01  1            1          5
2016-01-01  1            2          5
2016-01-01  2            1          2
2016-01-02  1            1          4
2016-01-03  1            1          3
2016-01-03  2            1          3
2016-01-03  2            2          3

我想显示每个日期的可用性(每个类别已添加),与策略无关。在这种情况下的结果应该是:

2016-01-01 => 7
2016-01-02 => 4
2016-01-03 => 6

我正在使用 groupdate gem,允许这样的查询:

Item.group_by_day(:dated).sum(:available)

此查询当然会在第一个日期返回 12 (应为 7 ), 9 (应为 6 )为最后一个。 如何只使用一个日期/类别组合?我尝试了.uniq(:category_id),但这似乎不起作用。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我建议这个数据库子查询...

subquery = Item.select('DISTINCT ON(items.dated, items.category_id) items.id').order(:dated, :category_id).to_sql

...然后像这样使用Rails group_by

  available_by_date = items
      .where("items.id in (#{subquery})")
      .group_by_day(:dated)
      .sum(:available)

答案 1 :(得分:0)

嗯,你必须找出你想要的值。我可以推测它是其中之一:

Item.group_by_day(:available).average(:available)

Item.group_by_day(:available).max(:available)

答案 2 :(得分:0)

你可以试试这个。

Item.group(["dated", "category_id"]).sum(:available)