SQL ROW_NUMBER

CREATE TABLE RowNumberTable
(
	ID UNIQUEIDENTIFIER,
	Version INT,
	DataStage VARCHAR(100)
)

SELECT * FROM RowNumberTable

INSERT INTO RowNumberTable(ID,[Version],DataStage)VALUES(NEWID(),1,'DS_02');
INSERT INTO RowNumberTable(ID,[Version],DataStage)VALUES(NEWID(),2,'DS_02');
INSERT INTO RowNumberTable(ID,[Version],DataStage)VALUES(NEWID(),3,'DS_02');
INSERT INTO RowNumberTable(ID,[Version],DataStage)VALUES(NEWID(),4,'DS_01');
INSERT INTO RowNumberTable(ID,[Version],DataStage)VALUES(NEWID(),5,'DS_01');
INSERT INTO RowNumberTable(ID,[Version],DataStage)VALUES(NEWID(),6,'DS_01');
INSERT INTO RowNumberTable(ID,[Version],DataStage)VALUES(NEWID(),7,'DS_03');
INSERT INTO RowNumberTable(ID,[Version],DataStage)VALUES(NEWID(),8,'DS_03');
INSERT INTO RowNumberTable(ID,[Version],DataStage)VALUES(NEWID(),9,'DS_03');

--DELETE FROM RowNumberTable
--获取信息
SELECT * FROM RowNumberTable
--根据Version排序
SELECT *, ROW_NUMBER() OVER (ORDER BY [Version] ASC) AS num FROM RowNumberTable
--根据DataStage,Version排序
SELECT *, ROW_NUMBER() OVER (ORDER BY DataStage ASC,[Version] ASC) AS num FROM RowNumberTable
--根据DataStage,排序
SELECT *, ROW_NUMBER() OVER (PARTITION BY DataStage ORDER BY [Version] ASC) AS num FROM RowNumberTable

--根据Version排序
SELECT *, ROW_NUMBER() OVER (ORDER BY [Version] ASC) AS num FROM RowNumberTable

--根据DataStage,Version排序
SELECT *, ROW_NUMBER() OVER (ORDER BY DataStage ASC,[Version] ASC) AS num FROM RowNumberTable

--根据DataStage,排序
SELECT *, ROW_NUMBER() OVER (PARTITION BY DataStage ORDER BY [Version] ASC) AS num FROM RowNumberTable

### SQLROW_NUMBER() 函数的使用方法与示例 #### 1. 基本定义 `ROW_NUMBER()` 是一种窗口函数,用于为查询结果集中每一行分配唯一的连续编号。该函数通常与其他子句(如 `OVER()`)一起使用,以便指定排序规则或分组条件。 --- #### 2. 基础语法 以下是 `ROW_NUMBER()` 的基础语法: ```sql ROW_NUMBER() OVER ([PARTITION BY column_list] ORDER BY sort_column_list) ``` - **`PARTITION BY`**:可选部分,用于将数据划分为若干分区,每个分区独立计数。 - **`ORDER BY`**:必填项,用于定义每行记录的排序依据。 --- #### 3. 示例分析 ##### 示例 1:简单排序 以下示例展示了如何基于 `first_name` 字段对客户列表进行排序,并为其分配唯一行号[^1]。 ```sql SELECT ROW_NUMBER() OVER (ORDER BY first_name) AS row_num, first_name, last_name, city FROM sales.customers; ``` ##### 示例 2:分页查询 假设需要实现分页功能,返回第一页(前 10 行)的数据,则可以通过以下方式完成[^2]: ```sql WITH cte_customers AS ( SELECT ROW_NUMBER() OVER (ORDER BY first_name, last_name) AS row_num, customer_id, first_name, last_name FROM customers ) SELECT customer_id, first_name, last_name FROM cte_customers WHERE row_num BETWEEN 1 AND 10; ``` 如果需要获取第二页(即第 11 到第 20 行),只需修改 `BETWEEN` 范围即可。 ##### 示例 3:分组排序 当需要按照某一字段分组并对各组内部进行排序时,可以结合 `PARTITION BY` 子句使用[^4]。例如,以下代码按 `aaa` 字段分组,并在每组内按 `score` 字段降序排列: ```sql SELECT aaa, bbb, score, ROW_NUMBER() OVER (PARTITION BY aaa ORDER BY score DESC) AS ro_no FROM table_name; ``` ##### 示例 4:复杂场景下的应用 考虑一个实际案例,假设有如下人员信息表 `PeopleInfo`[^3]: | id | name | Gender | numb | phone | FenShu | |----|--------|--------|------|-------|---------| | 1 | Alice | Female | A1 | P1 | 85 | | 2 | Bob | Male | A2 | P2 | 90 | | 3 | Charlie| Male | A3 | P3 | 78 | 现在希望根据性别 (`Gender`) 对分数 (`FenShu`) 排名,可以执行以下查询: ```sql SELECT id, name, Gender, FenShu, ROW_NUMBER() OVER (PARTITION BY Gender ORDER BY FenShu DESC) AS rank_within_gender FROM PeopleInfo; ``` 运行结果可能类似于这样: | id | name | Gender | FenShu | rank_within_gender | |----|--------|--------|--------|---------------------| | 2 | Bob | Male | 90 | 1 | | 3 | Charlie| Male | 78 | 2 | | 1 | Alice | Female | 85 | 1 | --- #### 4. 注意事项 - **唯一性保障**:即使存在重复值,`ROW_NUMBER()` 也会生成不重复的行号。 - **性能优化**:对于大规模数据集,应合理设计索引以提升效率。 - **兼容性问题**:虽然主流关系型数据库均支持此函数,但在具体实现细节上可能存在细微差别,请参照对应文档确认行为一致性[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值