資料庫中經常需要從特定分組中提取有限數量的行。在 PostgreSQL 中,可以使用 LIMIT 子句結合分組運算來滿足此需求。
以下範例示範了需要在每個 section_id 分組中檢索前兩行(按 name 列排序)的需求。例如,從給定的表中:
<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() 視窗函數為每個 section_id 分區內的每一行分配一個順序號。 ORDER BY 子句指定排序條件(在本例中為 name)。然後將 LIMIT 2 條件套用於子查詢,將結果限制為每個分組的前兩行(按 name 排序)。
以上是如何限制 PostgreSQL 中每個群組內的行數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!