oracle10g 如何查询一组数据中某个字段值最大的记录

时间:2021-07-29 14:26:52
         USER_ID      SCORE                  D_ID
--------------------- ---------- ---------------------
                    2       37.5                     1
                    2       28.5                     2
                    2       19.5                     3
                    3       13.2                     1
                    3       29.5                     2
                    3       35.5                     3
                    4       14.4                     1
                    4       13.5                     2     
                    4         29                     3
 
表 A 的数据如上,现在想要得到的结果如下:
              USER_ID      SCORE                  D_ID
--------------------- ---------- ---------------------
                    2       37.5                     1
                    3       35.5                     3
                    4         29                     3

从一个用户的记录中取出分数最高的那一条记录,三个字段都必须查询出来。

5 个解决方案

#1


这个sql该怎么写啊?各位帮帮忙。。。。

#2


select user_id,score,d_id from
   select user_id,score,d_id,
          rank() over (partition by user_id order by score desc) rk)
where rk=1;


若同一user_id存在相同的最高分,即多条最高分记录,上面语句会取出所有记录。

如果对同一user_id并列最高分只想取一条,则rank换成row_number

#3


select user_id,score,d_id from 
   (select user_id,score,d_id, 
          rank() over (partition by user_id order by score desc) rk) 
where rk=1; 


前面少了左括号。

#4


select t.* from tb t where SCORE = (select max(SCORE) from tb where USER_ID = t.USER_ID)

select t.* from tb t where not exists (select 1 from tb where USER_ID = t.USER_ID and SCORE > t.SCORE)

#5


引用 2 楼 suiziguo 的回复:
select user_id,score,d_id from
  select user_id,score,d_id,
          rank() over (partition by user_id order by score desc) rk)
where rk=1;


若同一user_id存在相同的最高分,即多条最高分记录,上面语句会取出所有记录。

如果对同一user_id并列最高分只想取一条,则rank换成row_number

用suiziguo 的方法问题解决了,谢谢.....

#1


这个sql该怎么写啊?各位帮帮忙。。。。

#2


select user_id,score,d_id from
   select user_id,score,d_id,
          rank() over (partition by user_id order by score desc) rk)
where rk=1;


若同一user_id存在相同的最高分,即多条最高分记录,上面语句会取出所有记录。

如果对同一user_id并列最高分只想取一条,则rank换成row_number

#3


select user_id,score,d_id from 
   (select user_id,score,d_id, 
          rank() over (partition by user_id order by score desc) rk) 
where rk=1; 


前面少了左括号。

#4


select t.* from tb t where SCORE = (select max(SCORE) from tb where USER_ID = t.USER_ID)

select t.* from tb t where not exists (select 1 from tb where USER_ID = t.USER_ID and SCORE > t.SCORE)

#5


引用 2 楼 suiziguo 的回复:
select user_id,score,d_id from
  select user_id,score,d_id,
          rank() over (partition by user_id order by score desc) rk)
where rk=1;


若同一user_id存在相同的最高分,即多条最高分记录,上面语句会取出所有记录。

如果对同一user_id并列最高分只想取一条,则rank换成row_number

用suiziguo 的方法问题解决了,谢谢.....