sql查询前后两位
SQL排名的问题,A这个人在数据库里排第十,怎么查询一个他前面两位,后面两位,包括自己的五条数据,各位有啥高招?
DECLARE @table TABLE
(
id INT PRIMARY KEY
IDENTITY(1, 1) ,
NAME VARCHAR(20)
)
INSERT INTO @table( NAME )VALUES ( 'AA' )
INSERT INTO @table( NAME )VALUES ( 'BB' )
INSERT INTO @table( NAME )VALUES ( 'CC' )
INSERT INTO @table( NAME )VALUES ( 'DD' )
INSERT INTO @table( NAME )VALUES ( 'EE' )
INSERT INTO @table( NAME )VALUES ( 'FF' )
INSERT INTO @table( NAME )VALUES ( 'GG' )
INSERT INTO @table( NAME )VALUES ( 'HH' )
INSERT INTO @table( NAME )VALUES ( 'II' )
INSERT INTO @table( NAME )VALUES ( 'JJ' )
方法: 1 .添加一个列,排序,记录中间需要的 mun 数,之后利用 between and 查询
DECLARE @min INT ,
@max INT SELECT @min = v.mun - 2 ,
@max = v.mun + 2
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY id ASC ) AS mun ,id,NAME
FROM @table
) v
WHERE v.NAME = 'ee' SELECT w.id ,
w.NAME
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY id ASC ) AS mun ,id,name
FROM @table
) w
WHERE w.mun BETWEEN @min AND @max
方法2. 利用链表查询,将一个分成两个集合,利用on 做条件 ON t1.mun BETWEEN t2.mun - 2 AND t2.mun + 2
SELECT t1.id ,
t1.NAME
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY id ASC ) AS mun ,id ,NAME
FROM @table
) T1
RIGHT JOIN
( SELECT ROW_NUMBER() OVER ( ORDER BY id ASC ) AS mun ,id ,NAME
FROM @table
) T2 ON t1.mun BETWEEN t2.mun - 2 AND t2.mun + 2
WHERE T2.NAME = 'EE'
方法3. 利用EXISTS
例子
SELECT *
FROM @table T1
WHERE EXISTS
( SELECT *
FROM @table T2
WHERE T2.NAME = 'EE'
AND T1.id BETWEEN T2.id - 2 AND T2.id + 2 )
完善
SELECT T1.id ,T1.name
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY id ASC ) AS mun ,id ,NAME
FROM @table
) T1
WHERE EXISTS
( SELECT mun ,id ,NAME
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY id ASC ) AS mun ,id ,NAME
FROM @table
) T2
WHERE T2.NAME = 'EE'
AND T1.mun BETWEEN T2.mun - 2 AND T2.mun + 2
)
张姿势了~_~!
sql查询前后两位的更多相关文章
- sql 四舍五入 保留两位小数
一.问题描述 数据库里的 float momey 类型,都会精确到多位小数.但有时候 我们不需要那么精确,例如,只精确到两位有效数字. 二.sqlserver解决方案: 1. 使用 Round() 函 ...
- sql 四舍五入保留两位小数
select convert(decimal(18, 2), 362315 * 1.0 / 10000) 1. ROUND(该函数,只是负责四舍五入到两位小数,但是不负责截断 只留两位小数,例如下例: ...
- SQL查询有两门以上不及格的学生及查询出全部及格的学生
1.表结构: /*学生*/ create table student( sno int not null primary key, sname ) ); /*课程*/ create table cen ...
- sql查询比较两表不同数据与相同数据
以下举例是查询相同数据,否则则相反 方法一: select * from A as x,B as y where x.a1=y.b1 and x.a2=y.b2 and x.a3=y.b3 方法二: ...
- SQL float 保留两位小数
1. SQL 数据库里类型改为numeric,小数位设置成22. 在SQL语句中转换:select convert(字段,numeric(18,2)) AS 字段3. 在DataFormatStrin ...
- SQL查询要求两个条件同时成立
SELECT * FROM [TABLE] WHERE CASE WHEN O_State='已处理' AND O_Pay='已付' THEN 0 ELSE 1 END=1
- [数据库] SQL查询语句表行列转换及一行数据转换成两列
原文来自:http://blog.csdn.net/Eastmount/article/details/50559008 本文主要讲述了SQL查询语句表之间的行列转换,同时也包括如何将一行数据转换成两 ...
- 装饰者模式的学习(c#) EF SaveChanges() 报错(转载) C# 四舍五入 保留两位小数(转载) DataGridView样式生成器使用说明 MSSQL如何将查询结果拼接成字符串 快递查询 C# 通过smtp直接发送邮件 C# 带参访问接口,WebClient方式 C# 发送手机短信 文件 日志 写入 与读取
装饰者模式的学习(c#) 案例转自https://www.cnblogs.com/stonefeng/p/5679638.html //主体基类 using System;using System.C ...
- 关于Oracle中查询的数字值的显示格式需要保留小数点后两位(或者三位,及其他位数)
关于Oracle中查询的数字值的显示格式需要保留小数点后两位(或者三位,及其... 方法一:使用to_char的fm格式,即: to_char(round(data.amount,2),'FM9999 ...
随机推荐
- CCF CSP 201509-2 日期计算
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201509-2 日期计算 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? ...
- 使用odbc时报错,驱动程序和应用程序之间的体系结构不匹配
当出现这个问题时说明:ODBC程序中使用的是32位的dsn,但本身机器是64位,所以要运行 C:\Windows\SysWOW64\odbcad32.exe来改变本身机器使用的odbc
- MVC框架定义
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码 ...
- 【基础知识】.Net基础加强 第二天
第02天 .Net基础加强 1. 封装 1> 属性的封装: 属性封装字段:把变化封装一下,保留用户的使用方式 2> 把方法的多个参数封装成一个对象 3> 将一堆代码封装到一个方法中 ...
- php缓存类 内置output_buffer(ob)
<?php class Cache { /** * $dir : 缓存文件存放目录 * $lifetime : 缓存文件有效期,单位为秒 * $cacheid : 缓存文件路径,包含文件名 * ...
- 直接插入排序(初级版)之C++实现
直接插入排序(初级版)之C++实现 一.源代码:InsertSortLow.cpp /*直接插入排序思想: 假设待排序的记录存放在数组R[1..n]中.初始时,R[1]自成1个有序区,无序区为R[2. ...
- springboot项目打war包部署到服务器(eclipse & gradle环境)
1.右键项目run as -> run configurations,打开Run configurations弹出框 2.右键Gradle Project -> New Configur ...
- 2-SAT的一些题目
http://blog.sina.com.cn/s/blog_64675f540100k2xj.html 都一个类型的不是很想写.
- 洛谷.4252.[NOI2006]聪明的导游(提答 直径 随机化)
题目链接 随机化 暴力: 随便从一个点开始DFS,每次从之前得到的f[i]最大的子节点开始DFS.f[i]为从i开始(之前)能得到的最大答案. 要注意的是f[i]应当有机会从更小的答案更新, 9.10 ...
- 【递推】Codeforces Round #483 (Div. 2) [Thanks, Botan Investments and Victor Shaburov!] D. XOR-pyramid
题意:定义,对于a数组的一个子区间[l,r],f[l,r]定义为对该子区间执行f操作的值.显然,有f[l,r]=f[l,r-1] xor f[l+1,r].又定义ans[l,r]为满足l<=i& ...