2015-09-05 161 views
0

想知道如何编写SQL函数来查找表中第N个最大元素,如果没有第N个最大元素,则返回Null。查找SQL中第N大元素

使用MySQL/MySQL工作台。

顺便说一句,我的问题与第N个最高工资问题不同,因为我有一个附加要求,如果第N个最大元素不存在,则返回Null。任何想法都表示赞赏。

在此先感谢, 林

+1

[SQL查询从工资表中查找第N个最高工资]的可能重复(http://stackoverflow.com/questions/3850034/sql-query-to-find-nth-highest-salary-from-a-salary -table) –

+0

@SabyasachiMishra,这是不一样的。我有一个额外的要求,如果第N个最大的元素不存在,返回Null。任何想法都表示赞赏。 –

+1

你想如何处理同等价值的元素? –

回答

3

你可以这样做:

SELECT t1.* 
FROM (
    SELECT * 
    FROM my_table 
    ORDER BY value DESC 
    LIMIT 1 
    OFFSET N -- Set your value for N here, N being 0-based 
) t1 
RIGHT OUTER JOIN (
    SELECT null -- This will guarantee that you have at least one row 
) t2 
ON TRUE 
+0

聪明而聪明。 :) –

1

我能想到的任何情况下,我会想这样做的......

SELECT * FROM ints; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

SELECT CASE WHEN COUNT(*) = 9 THEN x.i ELSE NULL END i 
    FROM ints x 
    JOIN ints y 
    ON y.i <= x.i 
GROUP 
    BY x.i 
ORDER 
    BY i DESC 
LIMIT 1; 
+------+ 
| i | 
+------+ 
| 8 | 
+------+ 

SELECT CASE WHEN COUNT(*) = 11 THEN x.i ELSE NULL END i 
    FROM ints x 
    JOIN ints y 
    ON y.i <= x.i 
GROUP 
    BY x.i 
ORDER 
    BY i DESC 
LIMIT 1; 
+------+ 
| i | 
+------+ 
| NULL | 
+------+ 
1

SELECT *from Employee_Test_salary 
 

 
go 
 

 
with emplsal as(
 
\t SELECT Emp_Sal ,DENSE_RANK() over (order by Emp_Sal desc) as rownumber 
 
\t from Employee_Test_salary 
 
) 
 
select top 1 Emp_Sal from emplsal where emplsal.rownumber =N

相关问题