我們經(jīng)常會有這樣的需求,即按照地區(qū)來分別取出每個地區(qū)排名前3的那些記錄。本文總結(jié)了幾種方法,希望大家補充。
首先,創(chuàng)建測試用的表和數(shù)據(jù),如下:
create table test
(
areaid int,
score int
)
insert into test select 0,10
union all select 0,20
union all select 0,30
union all select 0,40
union all select 0,50
union all select 1,10
union all select 1,20
union all select 1,30
union all select 1,40
union all select 1,50
union all select 2,10
union all select 2,20
union all select 2,30
union all select 2,40
union all select 2,50
go
第一種方法適用于sql2000和2005,其代碼如下:
select * from test a
where checksum(*) in (select top 3 checksum(*) from test b where a.areaid=b.areaid order by score desc)
第二種方法是利用sql2005的函數(shù)ROW_NUMBER,其代碼如下:
WITH test1 AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY areaid ORDER BY score desc) AS 'RowNumber'
FROM test
)
SELECT *
FROM test1
WHERE RowNumber BETWEEN 1 AND 3;
第三種方法是利用sql2005的cross apply來實現(xiàn),其代碼如下:
select distinct t.* from test a
cross apply
(select top 3 areaid,score from test
where a.areaid=areaid order by score desc) as T