SQL中Group分组获取Top N方法实现可首选row_number

有产品表,包含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其次,另外两个就基本不考虑了,数据量大的时候根本没法使用。

时间: 2024-10-27 14:15:05

SQL中Group分组获取Top N方法实现可首选row_number的相关文章

SQL中Group分组获取Top N方法实现可首选row_number_MsSql

有产品表,包含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, CONSTRA

SQL中实现SPLIT函数几种方法总结(必看篇)_Mysql

例1 代码如下 create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10)) returns @temp table(a varchar(100)) --实现split功能 的函数 --date :2003-10-14 as begin declare @i int set @SourceSql=rtrim(ltrim(@SourceSql)) set @i=charindex(@StrSeprate,@Sou

thinkphp3.x中变量的获取和过滤方法详解_php实例

本文实例讲述了thinkphp3.x中变量的获取和过滤方法.分享给大家供大家参考,具体如下: 这里我们来学习如何在ThinkPHP中使用变量和对变量进行过滤. 在Web开发过程中,我们经常需要获取系统变量或者用户提交的数据,这些变量数据错综复杂,而且一不小心就容易引起安全隐患,但是如果利用好ThinkPHP提供的变量获取功能,就可以轻松的获取和驾驭变量了. 一.获取变量 1.首先,我们来谈下如何获取变量. 第一种方式:传统获取方式,你仍然可以在开发过程中使用传统方式获取各种系统变量,例如: $i

thinkphp3.x中变量的获取和过滤方法详解

本文实例讲述了thinkphp3.x中变量的获取和过滤方法.分享给大家供大家参考,具体如下: 这里我们来学习如何在ThinkPHP中使用变量和对变量进行过滤. 在Web开发过程中,我们经常需要获取系统变量或者用户提交的数据,这些变量数据错综复杂,而且一不小心就容易引起安全隐患,但是如果利用好ThinkPHP提供的变量获取功能,就可以轻松的获取和驾驭变量了. 一.获取变量 1.首先,我们来谈下如何获取变量. 第一种方式:传统获取方式,你仍然可以在开发过程中使用传统方式获取各种系统变量,例如: $i

mongodb命令行group分组和java代码中group分组

group分组统计是数据库比较常用的功能,mongodb也不例外.不过相对于普通的增删改查,group操作就略微麻烦一些, 这里对group在shell中的操作.使用java原生代码操作以及集成spring进行操作进行一个简单的归纳总结,分组的途径和方法应该都有多种,这里每一样只举一例. 本例中数据源如下: 需要使用group实现的目的是:按年龄分组统计出每一组的数量. 1.mongo shell中执行如下命令: db.test.group({ key:{"age":1}, initi

MYSQL中GROUP分组去除重复数据

GROUP分组去除重复数据 /**  * 清除同一专题中重复导入的数据  * @author tanteng  * @date 2014.07.27  */ public function fuck_repeat(){  set_time_limit(0);  $sql = "SELECT `id` FROM `v95_special_content` GROUP BY `specialid`,`curl` HAVING COUNT(`curl`)>1 ";  $result =

浅析mongodb中group分组_MongoDB

group做的聚合有些复杂.先选定分组所依据的键,此后MongoDB就会将集合依据选定键值的不同分成若干组.然后可以通过聚合每一组内的文档,产生一个结果文档. 和数据库一样group常常用于统计.MongoDB的group还有很多限制,如:返回结果集不能超过16M, group操作不会处理超过10000个唯一键,好像还不能利用索引[不很确定]. Group大约需要一下几个参数.  1.key:用来分组文档的字段.和keyf两者必须有一个  2.keyf:可以接受一个javascript函数.用来

详解SQL中Group By的用法_MsSql

GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. 1.概述 "Group By"从字面意义上理解就是根据"By"指定的规则对数据进行分组,所谓的分组就是将一个"数据集"划分成若干个"小区域",然后针对若干个"小区域"进行数据处理. 2.原始表 3.简单Group By 示例1 select 类别, sum(数量) as 数量之和 from A group by 类别 返回结果如下表

深入浅析Extjs中store分组功能的使用方法_javascript技巧

在项目实践的过程中,遇到需要将grid中数据根据某一字段分组的要求,当然,这个功能在api中有,在此列出来以供大家查找: 两点需要注意的地方: 1.在创建store时,需要设置groupField属性的值,即为需要分组的值 for example: JavaScript代码 Ext.define('Person', { extend: 'Ext.data.Model', fields: ['name', 'sex'] }); 在这个数据模型中,我们需要以性别(sex)分组,那么请看下面的stor