/*十有三博客*/
  • 首页
  • 关于本站
  • 网站地图
  • RSS订阅

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

2014-09-06 十有三 0 浏览:1万+ 数据库 SQL

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='昆明市');

 


作者:十有三

出处:https://shiyousan.com/post/635456222636080287

版权声明:本文采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请声明出处或保留此段声明。


  • 上一篇: SQL 获取下一条数据
  • 下一篇: Javascript方法的覆盖和重写

相关文章
  • 解决SQL SERVER还原数据库错误:备份介质集不完整。介质簇计数: 2。缺失的介质簇序列号: 1
  • MongoDB小技巧:在命令提示符中通过任意路径执行MongoDB命令
  • 记录MongoDb连接错误System.TimeoutException: A timeout occured after 30000ms selecting a server
  • MongoDB学习笔记:28663 Cannot start server. The default storage engine 'wiredTiger' is not available
  • 创建 SQL Server Express自动备份数据库功能
  • 解决MongoVUE 修改错误: cannot use 'j' option when a host does not have journaling enabled

文章分类

.NET技术 123 数据库 24 Web前端 21 网站建设运维 37 操作系统与应用 66 程序猿日常 11 开发工具 12 其他随笔 13

文章标签

ASP.NET ASP.NET MVC C# CSS HTML IIS Javascript Linux MongoDB MySql SQL SQL Server Visual Studio Windows系统 版本控制系统 插件工具 服务器 搞笑娱乐 好文分享 软件应用 生活知识 手机问题 随笔 网络知识 网站设计优化 网站维护 养生保健 异常处理 硬件设备 游戏攻略

热门文章

  • IIS8如何安装和使用URL重写工具-URL Rewrite
  • 林蛋大与楚中天,朱肚皮与朱月坡
  • 解决IE11安装升级失败和在安装前需要更新的问题
  • Windows Server 2012无法安装 .NET3.5-安装角色或功能失败,找不到源文件
  • VS重构重命名的快捷键

推荐文章

  • 设置Windows10的微软拼音输入法默认为英文
  • KindEditor禁止用户输入a标签链接以及只允许指定HTML标签输入的方法和技巧
  • 解决和分析CSS中z-index属性无效的问题
  • VS添加命名空间的快捷键
  • 解决安卓中Outlook联系人无法同步两个手机号码的问题-手机2无法同步

友情链接

  • Passingwind的博客
  • 码友网

知识共享许可协议 CC BY-SA 4.0本站作品采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。
闽ICP备15003702号
闽公网安备 35020302035102号