私はPostgresを初めて使用していましたが、私は以前はMySQLを使用していました。MAX値の行から他のフィールドを選択する方法
私の問題はシンプルですが、MySQLでは決して起こりません。 t1
は私のメインテーブルであり、t2
はステータスと呼ばれるフィールドに発生した更新履歴をt1
という名前で保持しています。したがって、t1
のエントリがステータスフィールドを変更するたびに、新しいレコードが現在のタイムスタンプと新しいステータス値でt2
に追加されます。
t1
の特定のエントリの最新ステータスとタイムスタンプを取得したいとします。例えば、IDがのものです。次のクエリで最新のタイムスタンプを取得できます。
SELECT
t1.id,
t1.message,
MAX(t2.creation_timestamp)
FROM table_1 t1
LEFT JOIN table_2 t2 ON t1.id = t2.table_1_id
WHERE t1.id = 1271
GROUP BY t1.id,t1.message
しかし、私もMAXタイムスタンプでその特定の行のステータスを取得しようとします。
SELECT
t1.id,
t1.message,
t2.status,
MAX(t2.creation_timestamp)
FROM table_1 t1
LEFT JOIN table_2 t2 ON t1.id = t2.table_1_id
WHERE t1.id = 1271
GROUP BY t1.id,t1.message
は、私は次のエラーを取得する:
ERROR: column "t2.status" must appear in the GROUP BY clause or be used in an aggregate function
どのように私はMAXのタイムスタンプを持つレコードのステータスを取得できますか?
それともMySQLが理解するのに十分なスマートですクエリはMAX集合体から1行を返すので、selectに存在する場合は、その特定のものから他のフィールドを返します。とにかくPostgreSQLでそれを行うには? –
正しいプライマリキーと外部キーを定義すると、Postgresは十分にスマートになります。私の答えを参照してください –