与聚合函数一起使用RANK或DENSE_RANK

时间:2019-03-15 07:46:00

标签: oracle aggregate-functions rank dense-rank partition-by

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

series.ewm(span=2, adjust=False).mean()[-1]

在任何时间点,我只需要单行数据的最高得分,如果有多于1条记录,则采用行数最少的记录。

是否可以通过使用SCORE ROW_ID NAME 0.4 1011 ABC 0.95 1011 DEF 0.4 501 GHI 0.95 501 XYZ RANK函数来实现?分区依据如何?

DENSE_RANK

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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()在单独的列中显示工作时间最长的员工的薪水,但姓名,薪水,雇用日期等其他数据除外。