在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中文網其他相關文章!