PostgreSQL では、ウィンドウ関数と PARTITION BY 句を使用して、各グループの最初の N 行を取得できます。この手法は、各グループ内の行を特定の列で並べ替える必要がある場合に特に役立ちます。
次の形式を考えてみましょう:
<code class="language-sql">CREATE TABLE xxx ( id SERIAL PRIMARY KEY, section_id INT, name VARCHAR(255) ); INSERT INTO xxx (id, section_id, name) VALUES (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>
name 列でソートされた各セクション ID の最初の 2 行を抽出するには、次のクエリを使用できます:
<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() ウィンドウ関数を使用して、各グループに 1 から始まる一意の行番号を割り当てます。データをsection_idで分割し、各グループ内で行を名前でソートすることにより、ソートされたレコードに連続した行番号が割り当てられます。最後に、外側のクエリは行番号が 2 より大きい行をフィルターで除外し、セクション ID ごとに最初の 2 行を効果的に選択します。
以上がPostgreSQL の各グループ内の上位 N 行を選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。