我是oracle的初学者。在最近的搜索中,我看到了WHERE N-1,3-2
..so on。
它在搜索数据中如何工作?
到目前为止,这是我的代码attemtp:
SELECT name, salary
FROM #Employee e1
WHERE N-1 = (SELECT COUNT(DISTINCT salary) FROM #Employee e2
WHERE e2.salary > e1.salary)
答案 0 :(得分:0)
这是一个经典的(非常古老的)SQL查询,它的薪水排在第n位。我认为它在任何生产代码中都不再使用(我还没有看到),但是可能是面试官中最喜欢的问题。
您所指的N不是列或某些未知实体,而是占位符,该占位符应转换为有效查询中的有效整数或绑定参数。这是一个相关子查询,该子查询对外部查询处理的每一行进行一次评估。它的工作方式是对来自薪水大于来自外部查询的每个员工的员工的薪水值列表进行计数,并将结果限制在等于N-1的位置,这意味着您获得那些薪水排在第n位的行。
一种更常用的方法是使用分析函数dense_rank()
(或rank
,具体取决于您的需要)。如果您不了解这些功能,请阅读文档。
SELECT first_name,
salary
FROM (
SELECT e.*,
dense_rank() OVER(
ORDER BY salary desc
) rn
FROM employees e
)
WHERE rn = 6; -- ( n = 6 )
在Oracle 12c和更高版本中,即使以上查询有效,但使用方便的选项是FETCH..FIRST
语法。
SELECT *
FROM employees
ORDER BY salary DESC OFFSET 6 ROWS FETCH FIRST 1 ROWS WITH TIES; --n=6