首頁 > 軟體

SQL Server中row_number函數用法入門介紹

2023-03-02 18:00:24

一、SQL Server Row_number函數簡介

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

語法範例:

select *,row_number() over(partition by column1 order by column2) as n
from tablename

在上面語法中:

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

二、Row_number函數的具體用法

1.使用row_number()函數對結果集進行編號

範例:

對test_user表的查詢結果標記行號,並新增 “編號”列返回

-- 使用 ROW_NUMBER()函數對結果進行編號
select ROW_NUMBER() over(order by id) as 編號,* 
from test_user; 

執行結果:

可以看到,查詢結果新增了一列,專門用來標記行號。

有了編號,我們就可以方便地進行分頁查詢了,如何操作,可參考另外篇文章:sqlServer如何實現分頁查詢

2.對結果集按照指定列進行分組,並在組內按照指定列排序

範例:

把test_user表的name按照小組進行分組顯示,分組後在組內進行從低到高id排序

-- 使用partition by對結果集進行分組
select *,row_number() over(partition by name order by id) as n 
from  test_user; 

執行結果:

3.對結果集按照指定列去重

範例:

對 test_user表按name進行分組顯示,結果集中只顯示每組中一條 id最小的資料

select a.* from (
	select *,row_number() over(partition by name order by id) as row_id from test_user
	) as a 
-- 只查詢組內編號為1的資料
where a.row_id<2;

執行結果:

查詢結果先是經過name分組,然後組內進行id升序排序,組內編號為1的第1條資料,自然就是id最小的資料。

注意:

當我們按成績分數查詢名次等需求時,不能用row_number(),因為如果同班有兩個並列第一,row_number()只返回一個結果。這個時候就要用到另外一個函數,rank()和dense_rank()。

rank()和dense_rank()區別:

1、RANK()
在計算排序時,若存在相同位次,會跳過之後的位次。
例如,有3條排在第1位時,排序為:1,1,1,4······
2、DENSE_RANK()
這就是題目中所用到的函數,在計算排序時,若存在相同位次,不會跳過之後的位次。
例如,有3條排在第1位時,排序為:1,1,1,2······

 總結

到此這篇關於SQL Server中row_number函數用法入門介紹的文章就介紹到這了,更多相關SQLServer row_number函數用法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com