ホームページ >データベース >mysql チュートリアル >異なる ORDER BY 条件を使用して PostgreSQL の DISTINCT 行をクエリするにはどうすればよいですか?

異なる ORDER BY 条件を使用して PostgreSQL の DISTINCT 行をクエリするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-21 12:26:09465ブラウズ

How to Query DISTINCT Rows in PostgreSQL with Different ORDER BY Criteria?

PostgreSQL DISTINCT クエリ: ORDER BY の不一致の処理

PostgreSQL の DISTINCT ON 句は、DISTINCT ON 式が最初の ORDER BY 基準と一致しない場合に問題を引き起こす可能性があります。 これは、DISTINCT ON が、DISTINCT ON 句で決定された、ORDER BY 式で定義された各グループの最初の行を選択するためです。 順序が一致しないとエラーが発生します。

これを修正するには、通常、DISTINCT ON 式を ORDER BY 句の先頭の基準にする必要があります。 ただし、別の順序が望ましい場合は、別のアプローチを使用できます。

一意の行選択の代替方法

DISTINCT ON のみに依存するのではなく、選択した順序に基づいて各グループから「一番上の」行を取得するための次の戦略を検討してください。

方法 1: グループごとの最大 N

このアプローチでは、サブクエリを使用して各グループ内の最大値 (または最小値) を特定し、元のテーブルに結合して対応する行を取得します。 以下に例を示します:

<code class="language-sql">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;</code>

方法 2: ネストされた DISTINCT ON クエリ

より簡潔な PostgreSQL 固有のソリューションでは、ネストされたクエリを使用します。

<code class="language-sql">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;</code>

これらのメソッドでは、グループ化基準と異なる場合でも、最終的な順序の制御を維持しながら、一意の行を柔軟に選択できます。 特定のニーズとデータ構造に最も適した方法を選択してください。

以上が異なる ORDER BY 条件を使用して PostgreSQL の DISTINCT 行をクエリするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。