首頁 >資料庫 >mysql教程 >如何在 PostgreSQL 中選擇每個群組中的前 N ​​行?

如何在 PostgreSQL 中選擇每個群組中的前 N ​​行?

Susan Sarandon
Susan Sarandon原創
2025-01-15 10:46:46537瀏覽

How to Select the Top N Rows within Each Group in PostgreSQL?

在PostgreSQL中使用分組LIMIT選擇分組內的行

在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列排序的每個section_id的前兩行,可以使用下列查詢:

<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對資料進行分區,並在每個分組內按name對行進行排序,它將連續的行號分配給排序後的記錄。最後,外部查詢過濾掉行號大於2的行,有效地為每個section_id選擇前兩行。

以上是如何在 PostgreSQL 中選擇每個群組中的前 N ​​行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn