如何 return sql 中得分最高的名称(Oracle 11g)?

How to return the name with maximum score in sql (Oracle 11g)?

我在 Oracle 11g 数据库中有这个 table:

Id Name Score
-------------
1   A     1
2   A     2
3   A     3
4   B     2
5   B     1

而且我需要准备一个查询,其中 returns 每个名称(A 和 B)的行具有最高分数。在这个例子中它将是:

Id Name Score
-------------
3   A     3
4   B     2

我如何在 Oracle 11g 中执行此操作(我认为我不能使用 LIMIT 1)

谢谢!

使用row_umber()

select t.*
from (select t.*, row_number() over (partition by name order by score desc) as seq
      from table t
     ) t
where seq = 1;

您可以使用 group by:

select name, max(score),
       max(id) keep (dense_rank first order by score desc) as id
from t
group by name;

keep 表达式是 Oracle 的表达方式 "first"。

使用ROW_NUMBER():

with data as(
    select 1 id, 'A' name, 1 score from dual union all
    select 2 id, 'A' name, 2 score from dual union all
    select 3 id, 'A' name, 3 score from dual union all
    select 4 id, 'B' name, 2 score from dual union all
select 5 id, 'B' name, 1 score from dual
)
select id, name, score from(
  select id, name, score, row_number() over(partition by name order by score desc) rn
  from data
) where rn = 1;

ID NAME SCORE
-- ---- -----
 3 A        3
 4 B        2