У меня есть таблица сотрудников и зарплаты, определенные таким образом:
"name" (type: VARCHAR)
"salary" (type: INTEGER)
Какой запрос я могу использовать для получения второй самой высокой зарплаты в этой таблице?
У меня есть таблица сотрудников и зарплаты, определенные таким образом:
"name" (type: VARCHAR)
"salary" (type: INTEGER)
Какой запрос я могу использовать для получения второй самой высокой зарплаты в этой таблице?
Здесь указывается связь.
Name Salary
Jim 6
Foo 5
Bar 5
Steve 4
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees))
Result --> Bar 5, Foo 5
EDIT: Я взял второй пост Manoj, изменил его и сделал его более понятным для человека. Для меня n-1 не является интуитивным; однако, используя значение, которое я хочу, 2 = 2nd, 3 = 3rd и т.д.
/* looking for 2nd highest salary -- notice the '=2' */
SELECT name,salary FROM employees
WHERE salary = (SELECT DISTINCT(salary) FROM employees as e1
WHERE (SELECT COUNT(DISTINCT(salary))=2 FROM employees as e2
WHERE e1.salary <= e2.salary)) ORDER BY name
Result --> Bar 5, Foo 5
Прямой ответ на вторую самую высокую зарплату
SELECT name, salary
FROM employees ORDER BY `employees`.`salary` DESC LIMIT 1 , 1
другое интересное решение
SELECT salary
FROM emp
WHERE salary = (SELECT DISTINCT(salary)
FROM emp as e1
WHERE (n) = (SELECT COUNT(DISTINCT(salary))
FROM emp as e2
WHERE e1.salary <= e2.salary))
Кажется, я опоздал, чтобы ответить на этот вопрос. Как насчет этого лайнера, чтобы получить тот же результат?
SELECT DISTINCT salary FROM employees ORDER BY salary DESC LIMIT 1,1 ;
образец скрипки: https://www.db-fiddle.com/f/v4gZUMFbuYorB27AH9yBKy/0
create table svalue (
name varchar(5),
value int
) engine = myisam;
insert into svalue value ('aaa',30),('bbb',10),('ccc',30),('ddd',20);
select * from svalue where value = (
select value
from svalue
group by value
order by value desc limit 1,1)
ДЛЯ ВТОРОГО ПОСЛЕДНЕГО:
SELECT name, salary
FROM employee
ORDER BY salary DESC
LIMIT 1 , 1
ДЛЯ ТРЕТЬЕГО ПОСЛЕДНЕГО:
SELECT name, salary
FROM employee
ORDER BY salary DESC
LIMIT 2 , 1
Чтобы отобразить записи, имеющие второе наибольшее значение метки:
SELECT username, mark
FROM tbl_one
WHERE mark = (
SELECT DISTINCT mark
FROM tbl_one
ORDER by mark desc
LIMIT 1,1
);
простое решение
SELECT * FROM TBLNAME ORDER BY COLNAME ASC LIMIT (n - x), 1
Примечание: n = общее количество записей в столбце
x = value 2nd, 3rd, 4th highest etc
например
//to find employee with 7th highest salary
n = 100
x = 7
SELECT * FROM tbl_employee ORDER BY salary ASC LIMIT 93, 1
надеюсь, что это поможет
Нашел еще одно интересное решение
SELECT salary
FROM emp
WHERE salary = (SELECT DISTINCT(salary)
FROM emp as e1
WHERE (n) = (SELECT COUNT(DISTINCT(salary))
FROM emp as e2
WHERE e1.salary <= e2.salary))
К сожалению. Забыл писать. n - это n-ое число зарплат, которое вы хотите.
Вы можете использовать этот нижеуказанный запрос
SELECT emp.name, emp.salary
FROM employees emp
WHERE 2 = (SELECT COUNT(DISTINCT salary)
FROM employees
WHERE emp.salary<=salary
);
Вы можете изменить 2 на желаемую самую высокую запись.
Чтобы получить вторую самую высокую зарплату, просто используйте приведенный ниже запрос
SELECT salary FROM employees
ORDER BY salary DESC LIMIT 1,1;
Чтобы получить второе наивысшее значение:
SELECT `salary` FROM `employees` ORDER BY `salary` DESC LIMIT 1, 1;
Простое решение приведено ниже в запросе:
select max(salary) as salary from employees where salary<(select max(salary) from employees);
за 2-ую самую высокую зарплату
select max(salary) from salary where salary not in (select top 1 salary from salary order by salary desc)
за 3-ей самую высокую зарплату
select max(salary) from salary where salary not in (select top 2 salary from salary order by salary desc)
и т.д.
Чтобы получить наивысшее значение * N * th, лучше использовать это решение:
SELECT * FROM `employees` WHERE salary =
(SELECT DISTINCT(salary) FROM `employees`
ORDER BY salary DESC LIMIT {N-1},1);
или вы можете попробовать:
SELECT * FROM `employees` e1 WHERE
(N-1) = (SELECT COUNT(DISTINCT(salary))
FROM `employees` e2
WHERE e1.salary < e2.salary );
N = 2 для второго наивысшего N = 3 для третьего наивысшего и т.д.
SELECT name, salary
FROM employees
where
salary = (SELECT (salary) FROM employees GROUP BY salary DESC LIMIT 1,1)
Попробуйте воспользоваться этой возможностью, чтобы получить максимальную зарплату
Я пробовал это перед публикацией и прекрасно работает
например. найти 10-ю максимальную зарплату замените предел 9,1;
mysql> select name,salary from emp group by salary desc limit n-1,1;
SELECT MAX(salary) salary
FROM tbl
WHERE salary <
(SELECT MAX(salary)
FROM tbl);
SELECT DISTINCT Salary
FROM emp
ORDER BY salary DESC
LIMIT 1 , 1
Этот запрос даст вторую по величине зарплату дубликатов записей.
Попробуйте следующее:
SELECT DISTINCT(`salary`)
FROM `employee`
ORDER BY `salary` DEC
LIMIT 1,1
SELECT MIN(id) as id FROM students where id>(SELECT MIN(id) FROM students);
SELECT SALARY
FROM (SELECT *
FROM EMPLOYEE
ORDER BY SALARY
DESC LIMIT ***2***) AS TOP_SALARY
ORDER BY SALARY ASC
LIMIT 1
SELECT name, salary
FROM EMPLOYEES
WHERE salary = (
SELECT DISTINCT salary
FROM EMPLOYEES
ORDER BY salary DESC
LIMIT 1 , 1 )
with alias as
(
select name,salary,row_number() over(order by salary desc ) as rn from employees
)
select name,salary from alias where rn=n--n being the nth highest salary
SELECT username, salary
FROM tblname
GROUP by salary
ORDER by salary desc
LIMIT 0,1 ;
SELECT name, salary
FROM employees
order by salary desc limit 1,1
и этот запрос должен выполнить вашу работу.
Сначала мы сортируем таблицу по нисходящему пути, так что человек с самой высокой зарплатой находится наверху, а второй самый высокий - на второй позиции. Теперь limit a,b
означает пропустить начальные элементы a
, а затем распечатать следующие элементы b
. Поэтому в этом случае вы должны использовать limit 1,1
.
Надеюсь, что это поможет.
SELECT name,salary FROM employee
WHERE salary = (SELECT DISTINCT(salary) FROM employee ORDER BY salary DESC LIMIT 1,1) ORDER BY name
Получите второй, третий, четвертый... N-я наивысшая зарплата, используя следующий запрос
SELECT MIN(salary) from employees WHERE salary IN( SELECT TOP N salary FROM employees ORDER BY salary DESC)
Замените N номером i.e N = 2 для второй самой высокой зарплаты, N = 3 для третьей самой высокой зарплаты и так далее. Таким образом, для получения второй самой высокой зарплаты
SELECT MIN(salary) from employees WHERE salary IN( SELECT TOP 2 salary FROM employees ORDER BY salary DESC)
Попробуйте следующее:
Proc sql;
select employee, salary
from (select * from test having salary < max(salary))
having salary = max(salary)
;
Quit;