每個分類取最新的幾條的SQL實現

2021-04-17 10:56:48 字數 2636 閱讀 4536

分類統計時候,我們可能經常會碰到這樣的需求,每個分類按照一定順序,取幾條資料,然後在一起顯示。

這個問題的解決方法,我們通過搜尋引擎,可以找到很多中。但是不是sql語句過於複雜,就是在資料量比較大時候,效能特別成問題。

今天我就碰到這樣乙個需求。而我自己的解決方案就是sql過於複雜,或者效能比較差的。為此我在csdn論壇發了個帖子,看有沒有更好的解決方案。

csdn的 sql server 板塊  不愧是高手雲集,問題發出不到半小時,就獲得了近10種解決方案。經過測試,我把效能最高,且sql不複雜的方案整理出來。特別感謝 jinjazz 的解答。

問題詳細描述如下:

比如,假設我們有下面這樣結構的一張表,這張表的資料量非常巨大。

create

table

table1

([id] [bigint] identity(1,1) not

null,

[name] [nvarchar](128) not

null,

[class] int

notnull,

[date] datetime

notnull

)

class 表示分類編號。 分類數不固定, 至少有上千種分類

date 表示該條記錄被更新的時間

我們現在想獲得每個分類最新被更新的5條記錄。

解決方案

select id,name,class,date

from(

select id,name,class,date ,row_number() over(partition by class order

bydate

desc)

as rowindex from

table1) a

where rowindex <= 5

解決方案簡單說明:

這個解決方案的關鍵就是使用了sql 2005 的 row_number 這個全新的函式。

row_number ( ) 函式的語法如下:

row_number ( )     over ( [

] )

over 子句中的 partition by 將結果集分為多個分割槽。

over 子句中的 order by 將對 row_number 進行排序。

下面是msdn的幾個簡單例子:

以下示例將根據年初至今的銷售額,返回 adventureworks 中銷售人員的 row_number。

use adventureworks; 

goselect c.firstname, c.lastname ,

row_number() over(order

by salesytd desc) as 'row number' ,s.salesytd, a.postalcode

from sales.salesperson s inner

join person.contact c on s.salespersonid = c.contactid

inner

join person.address a on a.addressid = c.contactid

where territoryid is

notnull

and salesytd <> 0;

以下示例將返回行號為 50 到 60 的行(包含這兩行),並按 orderdate 進行排序。

use adventureworks; 

gowith orderedorders as ( select salesorderid, orderdate,

row_number() over (order

by orderdate) as 'rownumber'

from sales.salesorderheader )

select * from orderedorders where rownumber between 50 and 60;

以下示例說明了如何使用 partition by 引數。

use adventureworks; 

goselect c.firstname, c.lastname ,

row_number() over (partition by postalcode order

by salesytd desc) as 'row number' ,

s.salesytd, a.postalcode

from sales.salesperson s inner

join person.contact c on s.salespersonid = c.contactid

inner

join person.address a on a.addressid = c.contactid

where territoryid is

notnull

and salesytd <> 0;

每個分類取最新的幾條的SQL實現

分類統計時候,我們可能經常會碰到這樣的需求,每個分類按照一定順序,取幾條資料,然後在一起顯示。這個問題的解決方法,我們通過搜尋引擎,可以找到很多中。但是不是sql語句過於複雜,就是在資料量比較大時候,效能特別成問題。今天我就碰到這樣乙個需求。而我自己的解決方案就是sql過於複雜,或者效能比較差的。為...

每個分類取最新的幾條的SQL實現

分類統計時候,我們可能經常會碰到這樣的需求,每個分類按照一定順序,取幾條資料,然後在一起顯示。這個問題的解決方法,我們通過搜尋引擎,可以找到很多中。但是不是sql語句過於複雜,就是在資料量比較大時候,效能特別成問題。今天我就碰到這樣乙個需求。而我自己的解決方案就是sql過於複雜,或者效能比較差的。為...

每個分類取最新的幾條的SQL實現

問題點 分類統計時候,我們可能經常會碰到這樣的需求,每個分類按照一定順序,取幾條資料,然後在一起顯示。這個問題的解決方法,我們通過搜尋引擎,可以找到很多中。但是不是sql語句過於複雜,就是在資料量比較大時候,效能特別成問題。問題詳細描述如下 比如,假設我們有下面這樣結構的一張表,這張表的資料量非常巨...