经常遇到询问SQLSERVER中如何实现类似ORC里面的ROWNUM的方法,一般有两种方法,现总结如下
2006-07-24 08:32
609 查看
经常遇到询问SQLSERVER中如何实现类似ORC里面的ROWNUM的方法,一般有两种方法,现总结如下
:
1、利用临时表+IDENTITY(函数)来实现,举例如下:
SELECT
IDENTITY(smallint, 1, 1) AS ROWNUM,
OTHER FIELDS。。。。
INTO 临时表
FROM 来源
这样,在临时表里就有一个字段ROWNUM,其值就类似ORC里面的ROWNUM,用这个方法的话不必对来源进行排序,而且这个ROWNUM的值也不一定要从1开始,也可以从其他的值开始,如果我想要从11开始,那么上述语句我只需要把IDENTITY(smallint, 1, 1) AS ROWNUM改成IDENTITY(smallint, 11, 1) AS ROWNUM就可以了。
2、利用排序结合统计子查询来实现,但是此方法需要按一定的字段排序,举例如下
表A
field1 field2 field3
12 22 23
14 33 23
16 33 22
17 43 23
假设我现在需要过滤field3=23的记录并加上ROWNUM,那么语句如下
SELECT
(SELECT COUNT(*) FROM A WHERE field1=TMPA.field1) AS ROWNUM,
TMPA.*
FROM A AS TMPA
WHERE field3=23
ORDER BY field1
返回的结果为
ROWNUM field1 field2 field3
1 12 22 23
2 14 33 23
3 17 43 23
以上两种方法实现的结果都是一致的,但如果涉及到分组统计、大数据量的话,采用方法1的效率要高一些。
create table #11111111111(
phone varchar(21),
countn varchar(32)
)
select IDENTITY(smallint, 1, 1) AS ROWNUM,userphone,sum(datediff(ss,logintime,logouttime)) as listen_seconds
INTO #11111111111
from [ivr].[dbo].[calllogs] where serviceid='96'
and datepart(yyyy,logintime) = 2006 and datepart(mm,logintime) = 7
group by userphone
order by listen_seconds desc
drop table #11111111111
:
1、利用临时表+IDENTITY(函数)来实现,举例如下:
SELECT
IDENTITY(smallint, 1, 1) AS ROWNUM,
OTHER FIELDS。。。。
INTO 临时表
FROM 来源
这样,在临时表里就有一个字段ROWNUM,其值就类似ORC里面的ROWNUM,用这个方法的话不必对来源进行排序,而且这个ROWNUM的值也不一定要从1开始,也可以从其他的值开始,如果我想要从11开始,那么上述语句我只需要把IDENTITY(smallint, 1, 1) AS ROWNUM改成IDENTITY(smallint, 11, 1) AS ROWNUM就可以了。
2、利用排序结合统计子查询来实现,但是此方法需要按一定的字段排序,举例如下
表A
field1 field2 field3
12 22 23
14 33 23
16 33 22
17 43 23
假设我现在需要过滤field3=23的记录并加上ROWNUM,那么语句如下
SELECT
(SELECT COUNT(*) FROM A WHERE field1=TMPA.field1) AS ROWNUM,
TMPA.*
FROM A AS TMPA
WHERE field3=23
ORDER BY field1
返回的结果为
ROWNUM field1 field2 field3
1 12 22 23
2 14 33 23
3 17 43 23
以上两种方法实现的结果都是一致的,但如果涉及到分组统计、大数据量的话,采用方法1的效率要高一些。
create table #11111111111(
phone varchar(21),
countn varchar(32)
)
select IDENTITY(smallint, 1, 1) AS ROWNUM,userphone,sum(datediff(ss,logintime,logouttime)) as listen_seconds
INTO #11111111111
from [ivr].[dbo].[calllogs] where serviceid='96'
and datepart(yyyy,logintime) = 2006 and datepart(mm,logintime) = 7
group by userphone
order by listen_seconds desc
drop table #11111111111
相关文章推荐
- HashMap的遍历效率讨论经常遇到对HashMap中的key和value值对的遍历操作,有如下两种方法:
- 事务处理是在数据处理时经常遇到的问题,经常用到的方法有以下3种总结整理如下
- 批量删除记录时如何实现全选方法总结
- 总结了两种绘画透明窗体的方法,都有些缺陷,能适用一般情况
- 如何使用Mybatis来实现分页功能的两种方法
- 批量删除记录时如何实现全选方法总结 (转)http://www.cnblogs.com/chenou/articles/1349646.html[Asp.net Ajax 控件]
- 用Collections.sort方法对list排序有两种方法 第一种是list中的对象实现Comparable接口,如下: [java] view plain copy /** * 根据ord
- 如何用反射实现如下的泛型方法调用?
- 总结python实现父类调用两种方法的不同
- c++经常遇到的编译错误总结,以及vc++进行debug的方法
- android中SQLite的使用总结,用excSQL和rawQuery方法实现一般得增删改查
- 一列数字的规则如下;1,1,2,3,5,8,13,21,34........ 求第30位数字是多少,用递规和非递归两种方法算法实现
- SqlServer 经常使用分页方法总结
- 如何在火狐里面实现如下功能
- @V@ java代码笔记2010-06-12:java控制台输入各类型类实现;以及判断输入字符串里面是否有数字的两种方法:方法1:转换成字符数组;方法2:正则表达式。
- 如何去掉图片点击后的超级链接产生的虚框问题(两种实现方法)
- 总结div里面水平垂直居中的实现方法
- php如何实现页面回退的两种方法
- 如何C#中实现在TreeView查找某一节点(两种方法)
- 一列数字的规则如下;1,1,2,3,5,8,13,21,34........ 求第30位数字是多少,用递规和非递归两种方法算法实现