使用 RANK 或 DENSE_RANK 以及聚合函数

use RANK or DENSE_RANK along with aggregate function

我有一个 table 包含以下数据:

SCORE    ROW_ID   NAME
0.4      1011    ABC
0.95     1011    DEF
0.4      501     GHI
0.95     501     XYZ

在任何时候,我只需要得分最高的单行数据,如果有超过1条记录,则取得分最低的那条row_id。

是否可以使用RANKDENSE_RANK函数来实现?分区依据如何?

MAX(score) keep(dense_rank first order by row_id)

您不需要使用 dense_rank。这会有所帮助

SELECT * FROM (
  SELECT 
    SCORE,
    ROW_ID
    NAME 
  FROM T
  ORDER BY SCORE DESC, ROW_ID DESC
)
WHERE ROWNUM = 1;

您正在寻找最高分,一行,所以使用 row_number():

select score, row_id, name
  from (select t.*, row_number() over (order by score desc, row_id) rn from t)
  where rn = 1

demo

您可以在您的示例中使用 rankdense_rank,但它们可以 return 多行,例如当您向数据中添加行 (0.95, 501, 'PQR') 时.


keep dense_rank 通常在搜索值比搜索条件 other 时使用,例如,如果我们查找工作时间最长的员工的工资:

max(salary) keep (dense_rank first order by sysdate - hiredate desc)

max在这种情况下意味着如果有两个或更多员工工作时间最长,但与我们拿最高工资的天数完全相同。

max(salary) 
  keep (dense_rank first order by sysdate - hiredate desc) 
  over (partition by deptno)

同上,但按部门分别显示工作时间最长员工的工资。您甚至可以使用空 over() 在单独的列中显示工作时间最长的员工的薪水,但姓名、薪水、hire_date.

等其他数据除外