如何 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
我在 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