0

所以我对一般的 SQL 工作很陌生,更不用说 rails 了,但我有这个在 MySQL 中工作的语句:

portfolio_values.select("portfolio_values.*, SUM(portfolio_values.value) as totals").group("portfolio_values.day").map(&:totals)

但是在 postgresql 中抛出了这个错误:

GError:错误:列“portfolio_values.id”必须出现在 GROUP BY 子句中或在聚合函数中使用:从“portfolio_values”中选择“portfolio_values.*, SUM(portfolio_values.value)”作为“portfolio_values”的总计。“user_id” = 3 GROUP BY portfolio_values.day ActiveRecord::StatementInvalid: PGError: ERROR: column "portfolio_values.id" 必须出现在 GROUP BY 子句中或在聚合函数中使用

我只是不明白它在说什么我应该做不同的事情?

4

3 回答 3

1

从 PostgreSQL 9.1开始,列表中的主键列GROUP BY覆盖了整个表。因此,假设portfolio_values.id实际上是主键,您可以简化:

portfolio_values.select("portfolio_values.*, SUM(portfolio_values.value) as totals").group("portfolio_values.id").map(&:totals)

我引用9.1 发行说明

当在 GROUP BY 子句中指定主键时,允许查询目标列表中的非 GROUP BY 列 (Peter Eisentraut)

SQL 标准允许这种行为,并且由于主键,结果是明确的。


但是,在您的情况下,这两种方式都会导致胡说八道

一种。portfolio_values.id是主键。

然后SUM(portfolio_values.value)就没意思了。每组只能有一行。

湾。portfolio_values.id不是主键。

那么您不能将其包含portfolio_values.*SELECT列表中。


如果您想了解*in a的含义SELECT,请先阅读此处的手册

于 2012-06-26T23:52:22.913 回答
0

您只需将该portfolio_values.id列添加到GROUP BY语句中 - 如下所示:

portfolio_values.select("portfolio_values.*, SUM(portfolio_values.value) as totals").group("portfolio_values.id, portfolio_values.day").map(&:totals)

编辑

虽然这是有效的 SQL,但它不是一个有用的查询 - 请参阅其他帖子。

于 2012-06-26T23:05:10.120 回答
0

您可能希望在以下方面与众不同:

http://www.postgresql.org/docs/9.1/static/sql-select.html#SQL-DISTINCT

具体如下:

从 sometable 中选择 distinct on (yourdatefield) field1, field2, field3;

于 2012-06-27T15:45:14.270 回答