我有一个包含以下数据的表:
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
答案 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
您可以在示例中使用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()
在单独的列中显示工作时间最长的员工的薪水,但姓名,薪水,雇用日期等其他数据除外。