因此在MySQL中,在某些情况下,您可以使用子查询或限制甚至TOP找到最小的n个。但是我想知道是否可以不使用任何一个找到最小的N?有人告诉我这是可能的,但不知道从哪里开始。我认为我必须多次内联,但除此之外,我一无所知。
作为参考,假设我有一个名为薪金的列,其中包含以下数据(10,20,30,40)。如果n = 2,则意味着我需要找到第二小的薪水,即20。
答案 0 :(得分:2)
在MySQL 8.x中,您可以使用DENSE_RANK()
窗口函数,如下所示:
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
答案 1 :(得分:1)
例如:
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 |
+------+