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 |
+------+
所以在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 |
+------+