3

我正在使用 MySQL,我在员工表中有 50 条记录。我想找到薪水第 22 位的人。

4

5 回答 5

5

使用LIMIT,同时指定偏移量和行数。

要按最高薪水的顺序获得第 22 位的人,请执行以下操作:

SELECT person
FROM employee
ORDER BY salary DESC
LIMIT 21, 1

注意21这里的使用。这是因为初始行(第 1 高薪水)的偏移量实际上是 0。因此,第 22 高薪水实际上将是 21 的偏移量(从 0 开始计数的第 21 行,或“跳过 21 行”)。


要获得薪水第 22 位的人,您将需要多一层间接性。尝试:

SELECT person
FROM employee
WHERE salary = (
    SELECT DISTINCT salary
    FROM employee
    ORDER BY salary DESC
    LIMIT 21, 1
)
于 2013-02-06T06:58:55.110 回答
2

这是另一个,考虑到你有重复的工资号码。如果您有一些重复,我猜limit 将无法正确解决您的问题。试试这样的,

SELECT aa.*
FROM   table1 aa
       INNER JOIN
        (
          SELECT @row:=@row+1 rankNo,
                 a.Salary
          FROM   (SELECT DISTINCT Salary FROM table1) a, 
                 (SELECT @row:=0) s
          ORDER  BY Salary DESC
        ) bb ON aa.Salary = bb.Salary AND
                bb.rankNo = 2

考虑到你有这样的记录,

CREATE TABLE Table1
    (`EmpID` int, `Salary` int);

INSERT INTO Table1
    (`EmpID`, `Salary`)
VALUES
    (1, 10),
    (2, 12),  -- duplicate
    (3, 11),
    (4, 12),  -- duplicate
    (5, 14),
    (6, 12);  -- duplicate

╔═══════╦════════╗
║ EMPID ║ SALARY ║
╠═══════╬════════╣
║     1 ║     10 ║
║     2 ║     12 ║
║     3 ║     11 ║  -- you want to get this value (*2nd from the last value*)
║     4 ║     12 ║
║     5 ║     14 ║
║     6 ║     12 ║
╚═══════╩════════╝
于 2013-02-06T07:23:31.273 回答
1
SELECT MIN(salary) FROM (
    SELECT DISTINCT salary  FROM employee ORDER BY salary DESC LIMIT 22
) limited_salary
于 2019-04-03T18:29:07.867 回答
0

刚刚在这里回答了一个类似的问题: 选择所有行,除了最近的四个

在您的情况下,您需要将 LIMIT 限制为 1,并将 OFFSET 限制为 22 位置。

于 2013-02-06T06:58:37.487 回答
0

LIMIT 21,1

如何找到列的第 n 个最高值?

查询以查找列的第 n 个最大值

于 2013-02-06T06:59:03.813 回答