分類統計時候,我們可能經常會碰到這樣的需求,每個分類按照一定順序,取幾條資料,然後在一起顯示。
這個問題的解決方法,我們通過搜尋引擎,可以找到很多中。但是不是sql語句過於複雜,就是在資料量比較大時候,效能特別成問題。
今天我就碰到這樣乙個需求。而我自己的解決方案就是sql過於複雜,或者效能比較差的。為此我在csdn論壇發了個帖子,看有沒有更好的解決方案。
csdn的 sql server 板塊 不愧是高手雲集,問題發出不到半小時,就獲得了近10種解決方案。經過測試,我把效能最高,且sql不複雜的方案整理出來。特別感謝 jinjazz 的解答。
問題詳細描述如下:
比如,假設我們有下面這樣結構的一張表,這張表的資料量非常巨大。
createclass 表示分類編號。 分類數不固定, 至少有上千種分類table
table1
([id] [bigint] identity(1,1) not
null,
[name] [nvarchar](128) not
null,
[class] int
notnull,
[date] datetime
notnull
)
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語句過於複雜,就是在資料量比較大時候,效能特別成問題。問題詳細描述如下 比如,假設我們有下面這樣結構的一張表,這張表的資料量非常巨...