SQL中Group分组获取Top N方法实现可首选row_number
更新时间:2013年03月10日 17:42:51 作者:
统计每个城市的最新10个产品本文采用了游标方法/Count查询/cross apply方法/row_number方法等等对比不难发现Group获取Top N场景时,可以首选row_number,游标cursor其次,另外两个就基本不考虑了
有产品表,包含id,name,city,addtime四个字段,因报表需要按城市分组,统计每个城市的最新10个产品,便向该表中插入了100万数据,做了如下系列测试:
CREATE TABLE [dbo].[products](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NULL,
[addtime] [datetime] NULL,
[city] [nvarchar](10) NULL,
CONSTRAINT [PK_products] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
1、采用row_number方法,执行5次,平均下来8秒左右,速度最快。
select no, id,name,city
from (select no =row_number() over (partition by city order by addtime desc), * from products)t
where no< 11 order by city asc,addtime desc
2、采用cross apply方法,执行了3次,基本都在3分5秒以上,已经很慢了。
select distinct b.id,b.name,b.city from products a
cross apply (select top 10 * from products where city = a.city order by addtime desc) b
3、采用Count查询,只执行了两次,第一次执行到5分钟时,取消任务执行了;第二次执行到13分钟时,没有hold住又直接停止了,实在无法忍受。
select id,name,city from products a
where ( select count(city) from products where a.city = city and addtime>a.addtime) < 10
order by city asc,addtime desc
4、采用游标方法,这个最后测试的,执行了5次,每次都是10秒完成,感觉还不错。
declare @city nvarchar(10)
create table #Top(id int,name nvarchar(50),city nvarchar(10),addtime datetime)
declare mycursor cursor for
select distinct city from products order by city asc
open mycursor
fetch next from mycursor into @city
while @@fetch_status =0
begin
insert into #Top
select top 10 id,name,city,addtime from products where city = @city
fetch next from mycursor into @city
end
close mycursor
deallocate mycursor
Select * from #Top order by city asc,addtime desc
drop table #Top
通过上述对比不难发现,在面临Group获取Top N场景时,可以首选row_number,游标cursor其次,另外两个就基本不考虑了,数据量大的时候根本没法使用。
复制代码 代码如下:
CREATE TABLE [dbo].[products](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NULL,
[addtime] [datetime] NULL,
[city] [nvarchar](10) NULL,
CONSTRAINT [PK_products] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
1、采用row_number方法,执行5次,平均下来8秒左右,速度最快。
复制代码 代码如下:
select no, id,name,city
from (select no =row_number() over (partition by city order by addtime desc), * from products)t
where no< 11 order by city asc,addtime desc
2、采用cross apply方法,执行了3次,基本都在3分5秒以上,已经很慢了。
复制代码 代码如下:
select distinct b.id,b.name,b.city from products a
cross apply (select top 10 * from products where city = a.city order by addtime desc) b
3、采用Count查询,只执行了两次,第一次执行到5分钟时,取消任务执行了;第二次执行到13分钟时,没有hold住又直接停止了,实在无法忍受。
复制代码 代码如下:
select id,name,city from products a
where ( select count(city) from products where a.city = city and addtime>a.addtime) < 10
order by city asc,addtime desc
4、采用游标方法,这个最后测试的,执行了5次,每次都是10秒完成,感觉还不错。
复制代码 代码如下:
declare @city nvarchar(10)
create table #Top(id int,name nvarchar(50),city nvarchar(10),addtime datetime)
declare mycursor cursor for
select distinct city from products order by city asc
open mycursor
fetch next from mycursor into @city
while @@fetch_status =0
begin
insert into #Top
select top 10 id,name,city,addtime from products where city = @city
fetch next from mycursor into @city
end
close mycursor
deallocate mycursor
Select * from #Top order by city asc,addtime desc
drop table #Top
通过上述对比不难发现,在面临Group获取Top N场景时,可以首选row_number,游标cursor其次,另外两个就基本不考虑了,数据量大的时候根本没法使用。
您可能感兴趣的文章:
- sql分组后二次汇总(处理表重复记录查询和删除)的实现方法
- SQL SERVER 分组求和sql语句
- 显示同一分组中的其他元素的sql语句
- sql获取分组排序后数据的脚本
- SQL进行排序、分组、统计的10个新技巧分享
- SQL分组排序去重复的小实例
- 以数据库字段分组显示数据的sql语句(详细介绍)
- Sql Server:多行合并成一行,并做分组统计的两个方法
- Sql Server 分组统计并合计总数及WITH ROLLUP应用
- SQL语句分组获取记录的第一条数据的方法
- sqlserver巧用row_number和partition by分组取top数据
- 一句Sql把纵向表转为横向表,并分别分组求平均和总平均值
- sql 分组查询问题
- SQLserver 实现分组统计查询(按月、小时分组)
- 分组后分组合计以及总计SQL语句(稍微整理了一下)
相关文章
安装MSDE2000提示为了安全起见,要求使用强 SA 密码的解决方法
今天下载了一个msde2000A,本想按照平时的安装习惯,找到了setup.exe安装程序,错误提示弹出一个对话框:为了安全起见,要求使用强 SA 密码。请使用SAPWD开关提供同一密码。有关详细信息,请参阅自述文件。安装程序将立即退出2013-08-08Windows2012配置SQLServer2014AlwaysOn的图解
SQLserver 2014 AlwaysOn增强了原有的数据库镜像功能,使得先前的单一数据库故障转移变成以组(多个数据)为单位的故障转移。接下来通过本文给大家介绍Windows2012配置SQLServer2014AlwaysOn的方法,感兴趣的朋友一起学习吧2016-04-04MSSQL监控数据库的DDL操作(创建,修改,删除存储过程,创建,修改,删除表等)
下面就是一个解决上述问题的方案,我们通过创建一个表DatabaseLog和DDL触发器来解决问题,首先在msdb数据库里面新建一个表DatabaseLog,用来保存DDL触发器获取的信息2013-08-08将备份的SQLServer数据库转换为SQLite数据库操作方法
怎样将备份的SQLServer数据库转换为SQLite数据库操作方法:先要安装好SQLServer2005,并且记住安装时自己设置的用户名和密码,感兴趣的朋友可以参考下啊,或许本文对你有所帮助2013-02-02SQL Server 2012 sa用户登录错误18456的解决方法
这篇文章主要为大家详细介绍了SQL Server 2012 sa用户登录错误18456的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-09-09
最新评论