ホームページ >データベース >mysql チュートリアル >PostgreSQL で各グループ内の行を制限するにはどうすればよいですか?

PostgreSQL で各グループ内の行を制限するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-15 12:09:45554ブラウズ

How to Limit Rows Within Each Group in PostgreSQL?

PostgreSQL のグループ化制限: 各グループの最初の N 行を表示

データベースでは、特定のグループから限られた数の行を抽出することが必要になることがよくあります。 PostgreSQL では、グループ化操作と組み合わせて LIMIT 句を使用することで、この要件を満たすことができます。

次の例は、各セクション ID グループの最初の 2 行 (名前列でソート) を取得する必要があることを示しています。たとえば、指定されたテーブルから:

<code> id | section_id | name
----+------------+------
  1 |          1 | A
  2 |          1 | B
  3 |          1 | C
  4 |          1 | D
  5 |          2 | E
  6 |          2 | F
  7 |          3 | G
  8 |          2 | H</code>

次の結果を達成したいと考えています:

<code> id | section_id | name
----+------------+------
  1 |          1 | A
  2 |          1 | B
  5 |          2 | E
  6 |          2 | F
  7 |          3 | G</code>

8.4 より前の PostgreSQL バージョンでは、このようなクエリを効率的に処理するための組み込み関数が不足していました。ただし、PostgreSQL 8.4 以降では、新しいソリューションが登場しました:

<code class="language-sql">SELECT *
FROM (
  SELECT ROW_NUMBER() OVER (PARTITION BY section_id ORDER BY name) AS r, t.*
  FROM xxx t
) x
WHERE x.r <= 2;</code>

このソリューションでは、ROW_NUMBER() ウィンドウ関数を利用して、各セクション ID パーティション内の各行にシーケンス番号を割り当てます。 ORDER BY 句は並べ替え基準 (この場合は名前) を指定します。次に、 LIMIT 2 条件がサブクエリに適用され、結果が各グループの最初の 2 行 ( name でソート) に制限されます。

以上がPostgreSQL で各グループ内の行を制限するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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