SQL使用ROW_NUMBER函数获取没有ID的当前数据的上下文数据(上一条和下一条)

SQL SERVER中常常需要使用到SQL语句获取某条数据的上下文数据,即当前数据的上一条和下一条数据。一般都是根据数据的ID来过滤和排序。本文介绍的是在表结构没有ID的情况下,如何使用ROW_NUMBER SQL函数来获取上一条和下一条数据。

这里我们先创建一张城市表,只有一个城市名称字段(CityName):

CREATE TABLE [dbo].[City](
	[CityName] [nvarchar](100) NULL
) ON [PRIMARY]

然后任意的添加8条城市的名称数据:

insert into city (cityname) values('吉林市');
insert into city (cityname) values('海口市');
insert into city (cityname) values('太原市');
insert into city (cityname) values('郑州市');
insert into city (cityname) values('长沙市');
insert into city (cityname) values('贵阳市');
insert into city (cityname) values('成都市');
insert into city (cityname) values('昆明市');

这里假设我们要取昆明市的上下文数据,即吉林市和太原市:

SQL使用ROW_NUMBERSQL获取没有ID的当前数据的上下文数据(上一条和下一条)

这里有两种实现的方法,第一种方法是使用ROW_NUMBER函数将表数据加入序列号,然后将数据保存至临时表中,在通过查询临时表的序列号来获取上下文数据。第二种方法也是使用ROW_NUMBER函数,不过这里不用临时表,而是使用WITH表达式将数据放入指定临时命名的结果集,其实这两种方法都是大同小异的。

PS:ROW_NUMBER只能在SQL SERVER 2005以上的数据库才有支持!

方法一,使用临时表+ROW_NUMBER函数获取上下文数据

--将有序列号的数据插入到临时表中
SELECT ROW_NUMBER() OVER(ORDER BY CityName ASC) AS ROWID,* INTO #TB FROM [City];

--方法一,获取吉林市的数据(即上一条)
SELECT * FROM #TB
WHERE ROWID=(SELECT TOP(1) ROWID-1 FROM #TB WHERE CityName='昆明市');
--方法一,获取太原市的数据(即下一条)
SELECT * FROM #TB 
WHERE ROWID=(SELECT TOP(1) ROWID+1 FROM #TB WHERE CityName='昆明市');

阿三地方asdf

方法二,使用WITH表达式+ROW_NUMBER函数获取上一条和下一条数据

--方法二,获取吉林市的数据(即上一条)
WITH TB_Previous AS
(
SELECT ROW_NUMBER() OVER(ORDER BY CityName ASC) AS ROWID,* FROM [City]
)
SELECT * FROM TB_Previous
WHERE ROWID=(SELECT TOP(1) ROWID-1 FROM TB_Previous WHERE CityName='昆明市');

--方法二,获取太原市的数据(即下一条)
WITH TB_Next AS
(
SELECT ROW_NUMBER() OVER(ORDER BY CityName ASC) AS ROWID,* FROM [City]
)
SELECT * FROM TB_Next 
WHERE ROWID=(SELECT TOP(1) ROWID+1 FROM TB_Next WHERE CityName='昆明市');

 




原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/98352.html

(0)
上一篇 2021年8月21日 00:11
下一篇 2021年8月21日 00:11

相关推荐

发表回复

登录后才能评论