Mysql 从一列中找出最小的 n

Mysql Finding the smallest n from a column

所以在MySQL中你可以使用子查询或限制找到最小的n,在某些情况下甚至是TOP。但我想知道是否有可能在不使用这些的情况下找到最小的 N?有人告诉我这是可能的,但不知道从哪里开始。我假设我必须多次进行内部连接,但除此之外,我一无所知。

作为参考,假设我有一个名为 salary 的列,其中包含以下数据 (10,20,30,40)。如果 n=2,这意味着我需要找到第二小的薪水,也就是 20。

在MySQL 8.x中你可以使用DENSE_RANK() window函数,如:

select salary
from (
  select salary, dense_rank() over(order by salary) as rn from t
) x
where rn = 2 -- this gets the second smallest salary

例如:

DROP TABLE IF EXISTS salary;

CREATE TABLE salary (i INT NOT NULL PRIMARY KEY);

INSERT INTO salary VALUES (10),(20),(30),(40);


SELECT SUBSTRING_INDEX(
          SUBSTRING_INDEX(
             GROUP_CONCAT(i ORDER BY i)
          ,',',2)
       ,',',-1)n 
  FROM salary;
+------+
| n    |
+------+
| 20   |
+------+

或(特别针对 n=2 的地方)

SELECT MIN(i) x 
  FROM salary 
  LEFT 
  JOIN (SELECT MIN(i) y FROM salary) j 
    ON y = i 
 WHERE y IS NULL;
+------+
| x    |
+------+
|   20 |
+------+