Shao Voon Wong Ответов: 2

Как получить 2-ю самую высокую зарплату?


Это уже второй раз, когда я столкнулся с этим же вопросом в автономном тесте закрытого собеседования, чтобы получить 2-ю самую высокую зарплату.

Это команды SQL для создания таблицы и ее заполнения.
CREATE TABLE [dbo].[Employee](
	[Name] [nchar](10) NOT NULL,
	[Salary] [int] NOT NULL
) ON [PRIMARY]
GO

INSERT INTO Employee ([Name], [Salary]) VALUES ('Peter', 5000);
INSERT INTO Employee ([Name], [Salary]) VALUES ('Penny', 6000);
INSERT INTO Employee ([Name], [Salary]) VALUES ('Jackson', 7000);
INSERT INTO Employee ([Name], [Salary]) VALUES ('Jenny', 8000);


Что я уже пробовал:

Мой внутренний запрос выбирает верхние 2, упорядоченные по убыванию. Внешний запрос выбирает верхний 1, упорядоченный по возрастанию. Вот так я получаю 2-ю по величине зарплату. Мне было интересно, есть ли более элегантный способ сделать это.

SELECT TOP(1) [Name], [Salary] FROM (
SELECT TOP (2) [Name], [Salary]
  FROM [Test].[dbo].[Employee]
ORDER BY [Salary] DESC
) AS Emp
ORDER BY [Salary];


Вывод будет правильным следующим образом

Name	  Salary
Jackson   7000


Есть ли лучший способ сделать этот запрос?

2 Ответов

Рейтинг:
2

OriginalGriff

Как я уже сказал вам с вашим последним вопросом: Как отобразить результат при count=0 для внутреннего соединения SQL?[^]

Цитата:
Мы более чем готовы помочь тем, кто застрял, но это не значит, что мы здесь, чтобы сделать все это для вас! Мы не можем сделать всю работу, вам либо платят за это, либо это часть ваших оценок, и было бы совсем несправедливо, если бы мы сделали все это за вас.
А вопросы собеседования-это домашнее задание на стероидах: еще менее справедливо для нас отвечать на них, как если бы мы ставили в невыгодное положение людей, которые могут выполнить работу, на которую вы подали заявку.

Поэтому нам нужно, чтобы вы сделали работу, и мы поможем вам, когда вы застряли. Это не значит, что мы дадим вам пошаговое решение, которое вы можете сдать!
Начните с объяснения, где вы находитесь в данный момент и каков следующий шаг в этом процессе. Затем расскажите нам, что вы пытались сделать, чтобы этот следующий шаг сработал, и что произошло, когда вы это сделали.

Если вы не можете выполнить эту простую задачу, вы действительно не готовы получить эту работу и плохо провалите собеседование, если пройдете этот этап.
Удачи вам с поиском работы, но вы должны знать предмет до того, как подадите заявление, а не после!


Рейтинг:
13

Maciej Los

Вам нужно использовать функцию ранжирования: RANK (Transact-SQL) - SQL Server | Microsoft Docs[^], который возвращает ранг каждой строки в разбиении результирующего набора.

Представьте себе, что для результирующего набора: {5000, 6000, 7000, 7000, 8000} есть 2 строки (записи) с рангом два.

SELECT *
FROM (
    SELECT [Name], Salary, RANK() OVER(ORDER BY Salary DESC) As RankBySalary 
    FROM Employee
) T
WHERE T.RankBySalary=2


Shao Voon Wong

Спасибо. Это работало лучше, чем мое решение, потому что, когда есть 2 строки с одинаковой зарплатой, он отображал оба.

Спасибо снова.

Maciej Los

Всегда пожалуйста.

Sandeep Mewara

+5 :большой палец вверх:

Maciej Los

Спасибо, Сандип.

Fernando_Costa

Хороший совет!!

Maciej Los

Спасибо!