ROW_NUMBER⽤法详解
ROW_NUMBER⽤法详解
语法格式:row_number() over(partition by 分组列 order by 排序列 desc)
分组列和排序列都可以多个字段组合
row_number() over()分组排序功能:
使⽤ row_number() over()函数时,over()⾥头的分组以及排序的执⾏晚于 where 、group by、 order by 的执⾏。
1. row_number() over()
使⽤时排序字段放在over(ORDER BY 字段)⾥⾯,查询记录按排序字段升成序号升序输出。
注意事项:⽤了over排序后,sql语句后⾯不⽤再写Order BY⼦句排序。如果再写Order by⼦句,记录会按后⾯的Order by⼦句排序输出,记录排序不会按row_number产⽣的序号排序。
2. ROW_NUMBER() OVER PARTITION BY
使⽤ ROW_NUMBER() OVER(PARTITION BY 字段1 ORDER BY 字段2 Asc) 语句,按OVER⾥的字段1进⾏分组,然后按OVER⾥的order BY 字段2 进⾏组内排序,每组都是从1开始。
这时可根据需要在后⾯写另⼀个order BY ⼦句,记录排序按这个⼦句排序输出,跟ROW_NUMBER⽅法产⽣的序号⽆关。
⽰例
CREATE TABLE #temp_data(
id BIGINT PRIMARY KEY IDENTITY,
name NVARCHAR(50),
category INT,--分类id
sort_id INT,--排序id
addtime DATETIME
)
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '⽔果11', 1, 1,GETDATE());
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '⽔果12', 1, 2,GETDATE());
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '⽔果23', 2, 3,GETDATE());
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '⽔果24', 2, 4,GETDATE());
--SELECT * FROM #temp_data
insert语句字段顺序
--ROW_NUMBER() OVER
SELECT *,(ROW_NUMBER() OVER(ORDER BY category DESC,d.sort_id Asc)) as r_index
FROM #temp_data d
--ORDER BY id --如果再写Order by⼦句,记录会按后⾯的Order by⼦句排序
--ROW_NUMBER() OVER PARTITION BY 记录按后⾯的order BY ⼦句排序输出,跟ROW_NUMBER⽅法产⽣的序号⽆关。
SELECT (ROW_NUMBER() OVER(PARTITION BY d.category ORDER BY d.sort_id Asc)) as r_index,*
FROM #temp_data d ORDER BY category,r_index
DROP TABLE #temp_data

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。