我們經常會有這樣的需求,即按照地區來分別取出每個地區排名前3的那些記錄。本文總結了幾種方法,希望大家補充。
首先,創建測試用的表和數據,如下:
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的函數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來實現,其代碼如下:
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