SQL中Group分組獲取Top N方法實(shí)現(xiàn)可首選row_number
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方法,執(zhí)行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方法,執(zhí)行了3次,基本都在3分5秒以上,已經(jīng)很慢了。
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查詢,只執(zhí)行了兩次,第一次執(zhí)行到5分鐘時(shí),取消任務(wù)執(zhí)行了;第二次執(zhí)行到13分鐘時(shí),沒有hold住又直接停止了,實(shí)在無法忍受。
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、采用游標(biāo)方法,這個(gè)最后測(cè)試的,執(zhí)行了5次,每次都是10秒完成,感覺還不錯(cuò)。
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
通過上述對(duì)比不難發(fā)現(xiàn),在面臨Group獲取Top N場(chǎng)景時(shí),可以首選row_number,游標(biāo)cursor其次,另外兩個(gè)就基本不考慮了,數(shù)據(jù)量大的時(shí)候根本沒法使用。
- sql分組后二次匯總(處理表重復(fù)記錄查詢和刪除)的實(shí)現(xiàn)方法
- SQL SERVER 分組求和sql語句
- 顯示同一分組中的其他元素的sql語句
- sql獲取分組排序后數(shù)據(jù)的腳本
- SQL進(jìn)行排序、分組、統(tǒng)計(jì)的10個(gè)新技巧分享
- SQL分組排序去重復(fù)的小實(shí)例
- 以數(shù)據(jù)庫字段分組顯示數(shù)據(jù)的sql語句(詳細(xì)介紹)
- Sql Server:多行合并成一行,并做分組統(tǒng)計(jì)的兩個(gè)方法
- Sql Server 分組統(tǒng)計(jì)并合計(jì)總數(shù)及WITH ROLLUP應(yīng)用
- SQL語句分組獲取記錄的第一條數(shù)據(jù)的方法
- sqlserver巧用row_number和partition by分組取top數(shù)據(jù)
- 一句Sql把縱向表轉(zhuǎn)為橫向表,并分別分組求平均和總平均值
- sql 分組查詢問題
- SQLserver 實(shí)現(xiàn)分組統(tǒng)計(jì)查詢(按月、小時(shí)分組)
- 分組后分組合計(jì)以及總計(jì)SQL語句(稍微整理了一下)
相關(guān)文章
安裝MSDE2000提示為了安全起見,要求使用強(qiáng) SA 密碼的解決方法
今天下載了一個(gè)msde2000A,本想按照平時(shí)的安裝習(xí)慣,找到了setup.exe安裝程序,錯(cuò)誤提示彈出一個(gè)對(duì)話框:為了安全起見,要求使用強(qiáng) SA 密碼。請(qǐng)使用SAPWD開關(guān)提供同一密碼。有關(guān)詳細(xì)信息,請(qǐng)參閱自述文件。安裝程序?qū)⒘⒓赐顺?/div> 2013-08-08Windows2012配置SQLServer2014AlwaysOn的圖解
SQLserver 2014 AlwaysOn增強(qiáng)了原有的數(shù)據(jù)庫鏡像功能,使得先前的單一數(shù)據(jù)庫故障轉(zhuǎn)移變成以組(多個(gè)數(shù)據(jù))為單位的故障轉(zhuǎn)移。接下來通過本文給大家介紹Windows2012配置SQLServer2014AlwaysOn的方法,感興趣的朋友一起學(xué)習(xí)吧2016-04-04在SQL Server中將數(shù)據(jù)導(dǎo)出為XML和Json的方法
這篇文章主要介紹了在SQL Server中將數(shù)據(jù)導(dǎo)出為XML和Json的方法,需要的朋友可以參考下2015-02-02MSSQL監(jiān)控?cái)?shù)據(jù)庫的DDL操作(創(chuàng)建,修改,刪除存儲(chǔ)過程,創(chuàng)建,修改,刪除表等)
下面就是一個(gè)解決上述問題的方案,我們通過創(chuàng)建一個(gè)表DatabaseLog和DDL觸發(fā)器來解決問題,首先在msdb數(shù)據(jù)庫里面新建一個(gè)表DatabaseLog,用來保存DDL觸發(fā)器獲取的信息2013-08-08SQLServer 使用rand獲取隨機(jī)數(shù)的操作
這篇文章主要介紹了SQLServer 使用rand獲取隨機(jī)數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01將備份的SQLServer數(shù)據(jù)庫轉(zhuǎn)換為SQLite數(shù)據(jù)庫操作方法
怎樣將備份的SQLServer數(shù)據(jù)庫轉(zhuǎn)換為SQLite數(shù)據(jù)庫操作方法:先要安裝好SQLServer2005,并且記住安裝時(shí)自己設(shè)置的用戶名和密碼,感興趣的朋友可以參考下啊,或許本文對(duì)你有所幫助2013-02-02此數(shù)據(jù)庫沒有有效所有者,因此無法安裝數(shù)據(jù)庫關(guān)系圖支持對(duì)象
此數(shù)據(jù)庫沒有有效所有者,因此無法安裝數(shù)據(jù)庫關(guān)系圖支持對(duì)象。若要繼續(xù),請(qǐng)首先使用“數(shù)據(jù)庫屬性”對(duì)話框的“文件”頁或ALTER AUTHORIZATION語句將數(shù)據(jù)庫所有者設(shè)置為有效登錄名,然后再添加數(shù)據(jù)庫關(guān)系圖支持對(duì)象2012-01-01SQL Server 2012 sa用戶登錄錯(cuò)誤18456的解決方法
這篇文章主要為大家詳細(xì)介紹了SQL Server 2012 sa用戶登錄錯(cuò)誤18456的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09最新評(píng)論