0

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

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)
4

2 回答 2

0

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

SELECT * FROM (
  SELECT 
    SCORE,
    ROW_ID
    NAME 
  FROM T
  ORDER BY SCORE DESC, ROW_ID DESC
)
WHERE ROWNUM = 1;
于 2019-03-15T08:10:53.543 回答
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

演示

您可以在示例中使用rankand 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()来在单独的列中显示最长工作员工的工资,除了姓名、工资、雇用日期等其他数据。

于 2019-03-15T12:55:53.503 回答