2017-08-21 6 views
0

私は問い合わせたいと思っている単純なpostgresqlテーブルを持っています。 ...PostgreSQL Group期待どおりに動作しない - インクルードが多すぎる

| ID | Account_ID | Iteration | 
|----|------------|-----------| 
| 1 | 100  | 1   | 
| 2 | 101  | 1   | 
| 3 | 100  | 2   | 

を、このようなテーブルを画像化する私は繰り返しがその最大値であり、各ACCOUNT_IDのためのID列を取得する必要があります。だから、あなたはこのような何かが

SELECT "ID", "Account_ID", MAX("Iteration") 
FROM "Table_Name" 
GROUP BY "Account_ID" 

を働くだろうと思うだろうと私は得ることを期待:

| ID | Account_ID | MAX(Iteration) | 
|----|------------|----------------| 
| 2 | 101  | 1    | 
| 3 | 100  | 2    | 

をしかし、私はこれを行う際に、Postgresは文句:

ERROR: column "ID" must appear in the GROUP BY clause or be used in an aggregate function 

どちらを、私はそれだけでグループを破壊し、私にテーブル全体を与えることを行う!

次の方法でこれにアプローチする最善の方法はありますか?

SELECT DISTINCT ON ("Account_ID") "ID", "Account_ID", "Iteration" 
FROM "Marketing_Sparks" 
ORDER BY "Account_ID" ASC, "Iteration" DESC; 
+0

PostgreSQL独自の「distinct on」は、これをうまく解決し、推奨される方法です。さもなければ、少しのsql fooが必要です。 –

答えて

0

GROUP BY文は、グループに含まれる列の同じ値を持つ行を1行に集約します。この行は元の行と同じではないため、集計関数または集計関数でグループに含まれていない列を持つことはできません。あなたが望むものを得るためには、おそらくID列なしで選択し、結果を元のテーブルに結合する必要があります。 PostgreSQLの構文はわかりませんが、次のようなものになると思います。

SELECT Table_Name.ID, aggregate.Account_ID, aggregate.MIteration 
    (SELECT Account_ID, MAX(Iteration) AS MIteration 
    FROM Table_Name 
    GROUP BY Account_ID) aggregate 
LEFT JOIN Table_Name ON aggregate.Account_ID = Table_Name.Account_ID AND 
    aggregate.MIteration = Tabel_Name.Iteration 
関連する問題