e.g N is 2, I can either use densr_rank() or max to find second highest salary from Employee table.
select max(salary) as SecondHighestSalary from employee
where salary < (select max(salary) from employee)
above query works perfect, given the condition that if there is no second highest salary in the table, it returns NULL.
However I can achieve the similar results using dense_rank() function such as:
select e.salary as SecondHighestSalary
from (
select salary, dense_rank() OVER (order by salary desc) dr from employee) e
where dr = 2
above query works fine given there is ONLY one second highest salary in the table, if the table has salaries [300, null, null] its returning [null, null], I need only one answer in the result set. how can I achieve that ?
follow up to the question: in this case, which is better (in terms of memory/processing time) max or dense_rank ()?
This is a really interesting question. You haven't specified the database. But if I assume that you have an index on
salarythat can be used by the query (so possiblysalary descdepending on the database). Then your first query might have really good performance:I'm not promising that all databases would generate this plan, but two index lookups would typically be faster than
dense_rank()in this case.Of course, with any question like this, you should test on your data and your database. That is really the correct answer.