posts - 495,comments - 227,trackbacks - 0

          我們經常會有這樣的需求,即按照地區來分別取出每個地區排名前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

          posted on 2012-06-07 15:12 SIMONE 閱讀(505) 評論(0)  編輯  收藏 所屬分類: SQL SERVER
          主站蜘蛛池模板: 徐闻县| 桑日县| 锡林郭勒盟| 巨鹿县| 娄烦县| 九江县| 桃园市| 阜宁县| 保靖县| 黄浦区| 米易县| 海淀区| 汤原县| 武山县| 鄂尔多斯市| 梁平县| 定陶县| 许昌市| 三门县| 保亭| 新龙县| 武陟县| 惠安县| 青冈县| 收藏| 恩平市| 响水县| 措美县| 新巴尔虎左旗| 肥乡县| 高唐县| 桃园县| 漠河县| 上蔡县| 宜良县| 都兰县| 芷江| 乌兰察布市| 临邑县| 罗源县| 沙洋县|