日期:2014-05-20  浏览次数:20603 次

一条语句,蛋疼着呢
id name grade
 1 小明 90
 2 小刚 88
 3 小红 100
 4 小明 100
 5 小刚 90
 6 小红 80

我要查出这个效果: 3 小红 100
  4 小明 100
  5 小刚 90
-----------------------------
  1 小明 90 
  2 小刚 88
  6 小红 80
------------------------------
也就是说,每个人的分数最高的排一起,第2高的排一起,依次类推  

order by grade? 如果小明的分数排的2的比其他人第一的高就不对了

------解决方案--------------------
这需求确实蛋疼
 是不是还有个"科目"字段啊
 小明两个grade什么意思
------解决方案--------------------
根据人名进行分级,再排序!
------解决方案--------------------
把每个人独自排序 然后选择第几个位置的数据不就可以了吗
用数组吧
------解决方案--------------------
存储过程
------解决方案--------------------
不知道楼主是要用sql 语句完成所有排名并打印出来,还是可以每个一条件执行一句,比如我现在想查第一的可以用:
SQL code

select * from test.score where (grade,name) in (select max(grade) as grade,name from test.score group by name)

------解决方案--------------------
不好意思,上面的语句是在自己的机子上测试的。改一下
SQL code

select * from user where (grade,name) in (select max(grade) as grade,name from user group by name)

------解决方案--------------------
如果是用java代码的话,假设已经有user 实体,可以使用如下代码:
Java code

Comparator<User> comparator = new Comparator<User>(){
    public int compare(User u1,User u2){
         return u2.getGrade() - u1.getGrade();//排倒序
    }
};
Map<String,List<User>> users = new HashMap<String,List<User>>();
//key 为用户名,list 是每个相同用户名的n个实体
int index = 1;
int length = users.values().iterator().next().size();
for(;index<=length;index++){
    System.out.println("-------------第"+index+"高分----------");
    for(String key;users.keySet()){
        User user = users.get(key).get(index);
        System.out.println(user.getId()+"\t"+user.getName()+"\t"+user.getGrade());
    }

}

------解决方案--------------------
挺有意思的,需求明白了,你的要求是什么?用纯sql 还是 纯java?还是什么
------解决方案--------------------
order by grade desc
------解决方案--------------------
2个排序不就可以了
------解决方案--------------------
select *,(
select count(*) from Test001 
where Test001.name=x.name and 
Test001.id<>x.id and 
Test001.grade>=x.grade) as row 
from (select id,name,grade from Test001) as x 
order by row;

------解决方案--------------------
Test001是表名,若是sqlserver2005/2008 或oracle 9之后都有 rownumber 函数就好办多了,
要是想从低到高可是把 Test001.grade>=x.grade 变为 Test001.grade《=x.grade
------解决方案--------------------
Test001是表名,若是sqlserver2005/2008 或oracle 9之后都有 rownumber 函数就好办多了,
要是想从低到高可是把 Test001.grade>=x.grade 变为 Test001.grade《=x.grade