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 ...
随机推荐
- mycat性能调优
http://blog.csdn.net/wangshuang1631/article/details/69056070
- day9--回顾
线程 vs 进程 进程:一堆资源集的集合.线程:操作系统能够调度的最小单位. 进程和线程的谁快是误区,进程至少包含一个线程,是没有可比性的. 线程:共享内存,两个线程同时操作一个数据,要加锁.全 ...
- jquery跨域请求事例
//js发送跨域请求部分var requesturl = 'url'; $.ajax({ type:'GET', url:requesturl, data:{'qNum':num}, dataType ...
- linux用户下的.profile文件丢失
登录用户时出现以下问题: #su - wqq-bash-4.1$ -bash-4.1$ 查看时发现环境变量文件丢失造成的 解决方法: # ls -la /etc/skel/ total 36drwx ...
- 因为修改linux selinux修改错误产生的问题及解决办法
会出现这个错误: not syncing attempted to kill init 解决办法是: 开机后一直按e 然后按这个修改: https://www.deep-silver.com/kern ...
- 最短路算法 -- SPFA模板
一.算法步骤 建立一个队列,初始时队列里只有起始点,再建立一个数组记录起始点到所有点的最短路径(该数组的初始值要赋为极大值,该点到它本身的路径赋为0,下面的模板中该数组为dist[]).然后执行松弛操 ...
- 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式
[状态模式] No1: Wifi设置界面是一个叫做WifiSetting的Fragment实现的 No2: 在不同的状态下对于扫描Wifi这个请求的处理是完全不一样的.在初始状态下扫描请求被直接忽略, ...
- PHP的单引号和双引号
单引号内部的变量不会执行,双引号会执行. <?php $name = 'hello php'; echo "<h1>$name</h1>"; echo ...
- UVa210 Concurrency Simulator (ACM/ICPC World Finals 1991) 双端队列
Programs executed concurrently on a uniprocessor system appear to be executed at the same time, but ...
- hdu1527下沙小面的(二)
B - 下沙小面的(2) Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...