使用 RANK 或 DENSE_RANK 以及聚合函数
use RANK or DENSE_RANK along with aggregate function
我有一个 table 包含以下数据:
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)
您不需要使用 dense_rank。这会有所帮助
SELECT * FROM (
SELECT
SCORE,
ROW_ID
NAME
FROM T
ORDER BY SCORE DESC, ROW_ID DESC
)
WHERE ROWNUM = 1;
您正在寻找最高分,一行,所以使用 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
,但它们可以 return 多行,例如当您向数据中添加行 (0.95, 501, 'PQR')
时.
keep dense_rank
通常在搜索值比搜索条件 other 时使用,例如,如果我们查找工作时间最长的员工的工资:
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.
等其他数据除外
我有一个 table 包含以下数据:
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)
您不需要使用 dense_rank。这会有所帮助
SELECT * FROM (
SELECT
SCORE,
ROW_ID
NAME
FROM T
ORDER BY SCORE DESC, ROW_ID DESC
)
WHERE ROWNUM = 1;
您正在寻找最高分,一行,所以使用 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
,但它们可以 return 多行,例如当您向数据中添加行 (0.95, 501, 'PQR')
时.
keep dense_rank
通常在搜索值比搜索条件 other 时使用,例如,如果我们查找工作时间最长的员工的工资:
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.