PostgreSQL の DISTINCT ON 句の不一致エラーのトラブルシューティング
PostgreSQL の DISTINCT ON
句では、個別の列と正確に一致する ORDER BY
式が必要です。 異なる式を使用してクエリを実行しようとすると、エラーが発生します。 address_id
句の最初の要素として ORDER BY
を追加するだけでは、エラーを解決できますが、意図した結果が返されない可能性があります。
ORDER BY
句内の DISTINCT ON
を変更せずに正しいデータを取得する別の方法を次に示します。
方法 1: グループごとの最大 N アプローチ (DBMS に依存しない)
このメソッドは、サブクエリを使用して各 purchased_at
の最大 address_id
を検索し、元のテーブルに結合して完全な行を取得します。
SELECT t1.* FROM purchases t1 JOIN ( SELECT address_id, max(purchased_at) as max_purchased_at FROM purchases WHERE product_id = 1 GROUP BY address_id ) t2 ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at ORDER BY t1.purchased_at DESC;
方法 2: PostgreSQL 固有のソリューション
このアプローチでは、ネストされたクエリを活用し、内部クエリで DISTINCT ON
を使用して各 address_id
に必要な行を選択し、必要に応じて外部クエリで最終結果を順序付けします。
SELECT * FROM ( SELECT DISTINCT ON (address_id) * FROM purchases WHERE product_id = 1 ORDER BY address_id, purchased_at DESC ) t ORDER BY purchased_at DESC;
これらのアプローチは、DISTINCT ON
句の ORDER BY
式で妥協する必要を避け、希望の並べ替え順序を維持しながら必要なデータを取得するための柔軟なソリューションを提供します。
以上がPostgreSQL の DISTINCT ON の不一致 ORDER BY 句エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。