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

时间:2024-01-13 11:22:45 

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

标签:Group,Top,row,number
0
投稿

猜你喜欢

  • 90行Python代码开发个人云盘应用

    2021-12-17 13:44:12
  • 5个css布局的常见问题及解决方法

    2009-11-19 13:21:00
  • Linux 下 Python 实现按任意键退出的实现方法

    2022-08-07 14:22:01
  • 对Python中一维向量和一维向量转置相乘的方法详解

    2022-01-24 12:44:14
  • python自定义线程池控制线程数量的示例

    2022-12-25 15:16:13
  • jsp自定义标签之ifelse与遍历自定义标签示例

    2023-06-25 21:09:34
  • 漫谈前端开发中的团队合作

    2009-02-05 21:02:00
  • MySQL如何利用DCL管理用户和控制权限

    2024-01-14 13:33:21
  • vue+axios+java实现文件上传功能

    2024-04-30 10:40:32
  • SQL Server中的事务介绍

    2024-01-16 17:09:58
  • 如何基于python对接钉钉并获取access_token

    2023-11-27 04:25:07
  • 使用vue打包时gzip压缩的两种方案

    2024-05-21 10:29:45
  • ajax的responseText乱码的问题的解决方法

    2024-06-05 09:21:28
  • mysql格式化小数保留小数点后两位(小数点格式化)

    2024-01-21 10:33:58
  • Python中import语句用法案例讲解

    2023-08-07 05:33:47
  • MySQL多表查询与7种JOINS的实现举例

    2024-01-12 23:34:32
  • python高斯分布概率密度函数的使用详解

    2023-08-18 15:07:24
  • 浅谈配置OpenCV3 + Python3的简易方法(macOS)

    2023-03-26 02:35:36
  • Python绘制简单散点图的方法

    2023-02-22 02:01:07
  • Python视频编辑库MoviePy的使用

    2022-12-22 21:07:07
  • asp之家 网络编程 m.aspxhome.com