使用RANK或DENSE_RANK以及聚合函数

问题描述 投票:0回答:2

我有一个包含以下数据的表:

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)
oracle aggregate-functions rank dense-rank partition-by
2个回答
0
投票

您正在寻找最高分,一行,所以使用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,但它们可以返回多行,例如,当您向数据中添加行(0.95, 501, 'PQR')时。


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

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等其他数据除外。


0
投票

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

SELECT * FROM (
  SELECT 
    SCORE,
    ROW_ID
    NAME 
  FROM T
  ORDER BY SCORE DESC, ROW_ID DESC
)
WHERE ROWNUM = 1;
© www.soinside.com 2019 - 2024. All rights reserved.