表结构是这样的id name item score
1   'a'   1    20
2   'a'   2    20
3   'a'   3    10
4   'b'   1    15
5   'b'   2    25
6   'b'   3    30
7   'c'   1    25
8   'c'   2    10
9   'c'   3    20每个人 name 对应的 item 包括 1,2,3 三个固定的项。score是他们的得分。要求是每个人name三项的记录由3,2,1降序排序组成一组,但是每个人某个项目(这里为3)的得分要由高到低排序结果如下6   'b'   3    30
5   'b'   2    25
4   'b'   1    159   'c'   3    20
8   'c'   2    10
7   'c'   1    253   'a'   3    10
2   'a'   2    20
1   'a'   1    20
'b'第三项的得分30最高,所以b这一组数据排在最前面。'c'次之,'a'最后。但他们各自的数据由3,2,1降序组织。我这样说清楚了吗?请问怎么写这个查询排序语句?

解决方案 »

  1.   

    SELECT ID, b.NAME, item, score
      FROM test_a b,
           (SELECT NAME, ROWNUM a_rownum
              FROM (SELECT   NAME
                        FROM test_a
                    GROUP BY NAME
                    ORDER BY MAX (score) DESC)) awhere a.name=b.name
    order by a_rownum,item desc
      

  2.   


    select id,name,item,score
    from
    (select a.id ,a.name,a.item,a.score,b.rn
    from a,
    select ( name,
    row_number() over(partition name order by score desc) rn
    from  a
    where  item= 3
    ) b
    where a.name=b.name
    order by b.rn,a.item desc)
      

  3.   


    ---oracle 测试代码如下:create table test_a(id number,name varchar2(4),item number,score number);insert into test_a values(1,       'a' ,      1,         20);
    insert into test_a values(2,       'a' ,      2,         20); 
    insert into test_a values(3,       'a',       3,         10);
    insert into test_a values(4,       'b',       1,         15); 
    insert into test_a values(5,       'b',       2,         25); 
    insert into test_a values(6,       'b',       3,         30);
    insert into test_a values(7,       'c',       1,         25); 
    insert into test_a values(8,       'c',       2,         10); 
    insert into test_a values(9,       'c',       3,         20); commit;SELECT   ID,   b.NAME,   item,   score 
        FROM   test_a   b, 
                  (SELECT   NAME,   ROWNUM   a_rownum 
                        FROM   (SELECT       NAME 
                                            FROM   test_a 
                                    GROUP   BY   NAME 
                                    ORDER   BY   MAX   (score)   DESC))   a where   a.name=b.name 
    order   by   a.a_rownum,item   desc ;drop table test_a;