【问题标题】:Rails/SQL - How to filter by distinct value in a groupRails/SQL - 如何按组中的不同值进行过滤
【发布时间】:2020-07-29 22:55:58
【问题描述】:

我在 Rails 中工作,但 SQL 中的答案同样有帮助。假设我有一张用户表和一张购买表。我想找到只购买过物品 A 的用户。我希望使用如下查询:

User.joins(:purchases).group(:id).having("DISTINCT(item) = 'A'").pluck(:id)

这是对我需要回答的问题的简化,但这个分组问题是我的主要障碍。出于这个原因,我希望得到一个逻辑上非常相似的答案,因为其他解决方法可能不适用。

【问题讨论】:

    标签: sql ruby-on-rails count distinct having-clause


    【解决方案1】:

    这在 Rails 中有效吗?

    User.joins(:purchases).group(:id).having("MIN(item) = MAX(item) AND MIN(item) = 'A'").pluck(:id)
    

    这句话为:只有一个不同的值(因为MIN()MAX() 相等),即'A'

    或者:

    having("MAX(CASE WHEN item <> 'A' THEN 1 ELSE 0 END) = 0")
    

    代表:除了'A'之外没有其他值。

    【讨论】:

    • 谢谢!第一种方法奏效了。作为旁注,我处于独特的情况,我正在寻找 nil/null 作为不同的值。在整个组为零的情况下,MIN 返回 nil(我假设 MAX 也是如此)。所以我可以只用“MIN(item) is null”
    【解决方案2】:

    having 中,您只能在您进行分组的列上使用聚合函数(例如having count(id) &gt; 2)或表达式,例如having("id &gt; 1").

    因此,根据您的数据库,您可能会尝试找到一个聚合函数来识别每个 id 分组中是否存在项目。 对于 PostgreSql,这类似于(尚未测试):

    ...
    GROUP BY id
    HAVING 'A' = ANY(ARRAY_AGG(item))
    

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 1970-01-01
      • 2021-08-10
      • 2015-10-17
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      相关资源
      最近更新 更多