SQL Server Row_number()函數

在本教學中,將學習如何使用SQL Server ROW_NUMBER()函數為結果集的每一行分配一個連續整數。

SQL Server ROW_NUMBER()函數簡介

ROW_NUMBER()是一個Window函數,它為結果集的分區中的每一行分配一個連續的整數。 行號以每個分區中第一行的行號開頭。

以下是ROW_NUMBER()函數的語法:

ROW_NUMBER() OVER (
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
)

在上面語法中,

  • PARTITION BY子句將結果集劃分為分區。 ROW_NUMBER()函數分別應用於每個分區,並重新初始化每個分區的行號。PARTITION BY子句是可選的。如果未指定,ROW_NUMBER()函數會將整個結果集視為單個分區。
  • ORDER BY子句定義結果集的每個分區中的行的邏輯順序。 ORDER BY子句是必需的,因為ROW_NUMBER()函數對順序敏感。

SQL Server ROW_NUMBER()示例

下麵將使用示例資料庫中的sales.customers表來演示ROW_NUMBER()函數。

客戶表結構

1. 在結果集中使用SQL Server ROW_NUMBER()函數示例
以下語句使用ROW_NUMBER()為每個客戶行分配一個序號:

SELECT
   ROW_NUMBER() OVER (
 ORDER BY first_name
   ) row_num,
   first_name,
   last_name,
   city
FROM
   sales.customers;

執行上面查詢語句,得到以下結果:

查詢結果

在此示例中,未指定PARTITION BY子句,因此,ROW_NUMBER()將整個結果集視為單個分區。

2. 在分區上使用SQL Server ROW_NUMBER()示例
以下示例使用ROW_NUMBER()函數為每個客戶分配一個順序整數。 當城市發生變化時,它會重置數字:

SELECT
   first_name,
   last_name,
   city,
   ROW_NUMBER() OVER (
      PARTITION BY city
      ORDER BY first_name
   ) row_num
FROM
   sales.customers
ORDER BY
   city;

執行上面查詢語句,得到以下結果:

查詢結果

在此示例中,使用PARTITION BY子句將客戶按城市劃分為分區。 當城市發生變化時,行號重新初始化。

3. 使用ROW_NUMBER()進行分頁

ROW_NUMBER()函數對於應用程式中的分頁很有用。 例如,可以按分頁顯示客戶列表,每個頁面有10行。

以下示例使用ROW_NUMBER()將客戶從第11行返回到第20行作第二頁顯示的結果:

WITH cte_customers AS (
    SELECT
        ROW_NUMBER() OVER(
             ORDER BY
                first_name,
                last_name
        ) row_num,
        customer_id,
        first_name,
        last_name
     FROM
        sales.customers
) SELECT
    customer_id,
    first_name,
    last_name
FROM
    cte_customers
WHERE
    row_num > 20 AND
    row_num <= 30;

執行上面查詢語句,得到以下結果:
查詢結果

在這個例子中:

  • 首先,CTE使用ROW_NUMBER()函數為結果集中的每一行分配一個連續的整數。
  • 其次,外部查詢返回第二頁的行,其行號在1120之間。

在本教學中,學習了如何使用SQL Server ROW_NUMBER()函數為查詢分區中的每一行分配一個順序整數。


上一篇: SQL Server Window函數 下一篇:無