0

したがって、私は一般的にSQLで作業するのは非常に初めてで、レールは言うまでもありませんが、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 句に指定するか、集計関数で使用する必要があります: SELECT ポートフォリオ値.*, SUM(portfolio_values.value) as totals FROM "portfolio_values" WHERE "portfolio_values"."user_id" = 3 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)無意味です。グループごとに 1 つの行しか存在できません。

b. 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 から (yourdatefield) フィールド 1、フィールド 2、フィールド 3 で異なるものを選択します。

于 2012-06-27T15:45:14.270 に答える