我有一个包含以下数据的表:
SCORE ROW_ID NAME
0.4 1011 ABC
0.95 1011 DEF
0.4 501 GHI
0.95 501 XYZ
在任何时候,我只需要具有最高分数的单行数据,如果有超过1个记录,则选择具有最小row_id的数据。
是否可以通过使用RANK
或DENSE_RANK
函数来实现?分区怎么样?
MAX(score) keep(dense_rank first order by row_id)
您正在寻找最高分,一行,所以使用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
您可以在示例中使用rank
和dense_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等其他数据除外。
你不需要使用dense_rank。这会有所帮助
SELECT * FROM (
SELECT
SCORE,
ROW_ID
NAME
FROM T
ORDER BY SCORE DESC, ROW_ID DESC
)
WHERE ROWNUM = 1;