表user ID为自动增长 gradetypeid 表示几年级
select id,name,gradetypeid,brownum,age,meteid,[date] from users
结果
1 张三 1 11 12 1 2012-10-11
2 张四 2 16 11 9 2012-09-10
3 张五 2 17 7 8 2012-09-01
4 张六 3 16 9 10 2012-08-07
5 张七 3 18 7 4 2012-09-10
6 张八 2 19 9 7 2012-07-06
7 张九 2 21 16 8 2012-05-04
8 张十 3 41 19 12 2012-06-09
9 李一 1 71 7 6 2012-03-01
11 李二 3 99 19 11 2012-09-11 
13 李四 1 88 10 5 2012-01-08
14 王五 2 54 15 7 2012-06-05
15 王六 3 33 16 15 2012-02-03
16 王七 3 44 17 16 2012-09-10
18 王九 3 56 19 19 2012-03-09
19 关一 3 34 20 21 2012-06-07
表grade id为自动增长
select id, gradename,gradeid,gradetypeid,gradetypename,meteid,stype from [grade]
结果
1 一年级 1 1 小学 1 1
3 三年级 3 2 初中 9 2
4 二年级 5 2 初中 8 3
5 一年级 1 3 高中 10 3
6 二年级 2 3 高中 4 2 
7 一年级 1 2 初中 7 3
9 二年级 2 2 初中 8 1 
10 三年级 3 3 高中 12 2
11 六年级 6 1 小学 6 3
12 二年级 2 3 高中 11 1
13 五年级 5 1 小学 5 2
15 一年级 1 2 初中 7 3
16 一年级 1 3 高中 15 1
18 二年级 2 3 高中 16 2
19 三年级 3 3 高中 19 3
20 一年级 1 3 高中 21 1
我想得到的结果是 高中 一年级 ,二年级,三年级 brownum最大的前两名同学,若同年级stype相同则过滤查下一条数据
id name gradename gradetypename age stype
19 关一 一年级 高中 20 1
13 李四 一年级 高中 10 3
11 李二 二年级 高中 19 1
16 王七 二年级 高中 17 2
18 王九 三年级 高中 19 3
8 张十 三年级 高中 19 2 这里的 高中一年级李四 brownum没有高中一年级的王六 brownum大 但 王六与关一的stype是相同的 所以舍去王六。

解决方案 »

  1.   

    在users表里应该还有一个gradeid与grade表里的id关联,否则按照你给出的数据得不到你要的结果
      

  2.   


    SELECT * FROM 
    (
    SELECT a.id ,name, gradetypename, gradename ,brownum, age,
    row=ROW_NUMBER()OVER(PARTITION BY [gradename]  ORDER BY brownum  DESC) 
    FROM #users a JOIN #grade b ON a.gradetypeid=b.gradetypeid and a.[meteid]=b.[meteid]
    WHERE [gradetypename]='高中'
    ) t
    WHERE row<=2这里没有判断stype 。就不知道如果判断怎么写
    结果
    id name gradename gradetypename age
    19 关一 一年级 高中 20
    15 王六 一年级 高中 16
    11 李二 二年级 高中 19
    16 王七 二年级 高中 17
    18 王九 三年级 高中 19
    8 张十 三年级 高中 19