重写一个查询以避免PG :: GroupingError:ERROR:在GROUP BY子句中或在聚合函数中使用

时间:2016-05-05 08:23:13

标签: ruby-on-rails postgresql activerecord

在发布此问题之前,我尝试了很多其他选择。 我在表A上查询了列:id,num,user_id。 id是PK,user_id可以是重复的。 我需要拥有所有行,以便只有唯一的user_id选择具有最高的num值。为此,我在下面提出了一个SQL,它将在Oracle数据库中运行。我在Postgres数据库的rails平台上使用ruby。

select stats.* from stats as A 
where A.num > (
      select B.num
      from stats as B
      where A.user_id == B.user_id 
      group by B.user_id  
      having B.num> min(B.num) ) 

我尝试通过主动记录方法编写此查询,但仍然遇到

  

PG :: GroupingError:ERROR:column" b.num"必须出现在GROUP BY中   子句或用于聚合函数

Stat.where("stats.num > ( select B.nums from stats as B  where stats.user_id = B.user_id group by B.user_id having B.num < max(B.num) )")

有人可以告诉我编写此查询的其他方式

1 个答案:

答案 0 :(得分:0)

Rails中子查询的SELECT子句与您示例的子查询不匹配。请注意,由于您在min(B.num)子句中执行了汇总功能HAVING,因此您还必须将其包含在SELECT子句中:

Stat.where("stats.num > ( select B.num from stats as B where stats.user_id = B.user_id group by B.user_id having B.num < max(B.num) )")

您可能还需要一个条件来处理select B.num from stats as B where stats.user_id = B.user_id group by B.user_id having B.num < max(B.num)返回多行的情况。