【问题标题】:distinct with multiple columns and then group by one - rails, mysql与多列不同,然后按一个分组-rails,mysql
【发布时间】:2021-03-27 15:26:06
【问题描述】:

我有一个数据集,它为基础查询提供基础输出:

Analyze
  .where(some_conditions)
  .joins(category: [category_subs: :sub])
  .select('user_id, product_id, category_subs.sub_id as sub_id, is_successful, category_subs.level as level')
+---------+-------------+---------------+--------+-------------+
| user_id | product_id  | is_successful | sub_id | level       |
+---------+-------------+---------------+--------+-------------+
| 3223    | 20441       | 1             | 56     | 14          |
| 3223    | 20441       | 1             | 72     | 22          |
| 3223    | 20441       | 1             | 20     | 22          |
| 3223    | 20443       | 1             | 20     | 14          |
| 3223    | 20443       | 1             | 20     | 22          |
| 3223    | 20443       | 1             | 25     | 6           |
| 3223    | 20443       | 1             | 7      | 22          |
| 3223    | 20444       | 1             | 20     | 14          |
| 3223    | 20444       | 1             | 20     | 22          |
| 3223    | 20444       | 1             | 25     | 6           |
| 3223    | 20444       | 1             | 7      | 22          |
| 3223    | 20445       | 0             | 20     | 14          |
| 3223    | 20445       | 0             | 20     | 22          |
| 3223    | 20445       | 0             | 25     | 6           |
| 3223    | 20445       | 0             | 7      | 22          |
| 3223    | 20448       | 1             | 20     | 14          |
| 3223    | 20448       | 1             | 20     | 22          |
| 3223    | 20448       | 1             | 25     | 6           |
| 3223    | 20448       | 1             | 7      | 22          |
| 3223    | 20449       | 1             | 20     | 14          |
| 3223    | 20449       | 1             | 4      | 2           |
| 3223    | 20449       | 1             | 24     | 14          |
+---------+-------------+---------------+--------+-------------+

我想从该数据中获得成功,忽略 level 属性。

我已经尝试过了,但它并没有像我预期的那样工作:

Analyze
  .where(some_conditions)
  .joins(category: [category_subs: :sub])
  .group('sub_id')
  .select('user_id, product_id, category_subs.sub_id as sub_id, sum(is_successful=0)')

输出没有给出我想要的结果的输出:

+--------+----------------------+
| sub_id | sum(is_successful=1) |
+--------+----------------------+
| 4      | 1                    |
| 7      | 3                    |
| 20     | 8                    |
| 24     | 1                    |
| 25     | 3                    |
| 56     | 1                    |
| 72     | 1                    |
+--------+----------------------+

预期的输出应该是:

+--------+----------------------+
| sub_id | sum(is_successful=1) |
+--------+----------------------+
| 4      | 1                    |
| 7      | 3                    |
| 20     | 5                    |
| 24     | 1                    |
| 25     | 3                    |
| 56     | 1                    |
| 72     | 1                    |
+--------+----------------------+

我可以通过 ruby​​ 方式获取数据,但我需要在 ActiveRecord::Relation 实例中使用它。

【问题讨论】:

    标签: mysql ruby-on-rails


    【解决方案1】:
    select
      t.sub_id,
      count(*)
    from (
      select sub_id
      from f
      where is_successful = 1
      group by
        product_id,
        sub_id
      order by sub_id
    ) t
    group by t.sub_id;
    

    这可能行得通。您可以使用 ActiveRecord from 为 from 语句创建内部查询,然后在外部选择中使用该结果。

    Here 一个小提琴。

    【讨论】:

    • 对不起,我忘了(!)提及导致问题的部分,我已经更新了我的问题,添加了“级别”列。
    • 是的(对我来说)。例如,sub 20 的成功值似乎是 8(显示在最后一个输出表中)但我想忽略 level 属性,成功值应该是 5。
    • 在你的 sql fiddle 中,对于 sub_id 20,SUM(is_successful) 值为 8。但是如果我们忽略 level,应该是5,正如我所料。
    • 我想展示一下子类20的这个产品有多少在一些用户手中是成功的,不想考虑子类的级别。如果我们让第一个表中的数据按用户、产品和子 id 唯一并忽略级别 attr,我们会看到只有 5 条记录的子 ID 为 20。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多