SQL-запрос для печати имени сотрудника, получающего максимальное повышение годовой зарплаты на % с 2018 по 2019 год

#sql

Вопрос:

Я очень новичок в SQL и уже несколько дней практикуюсь в прямых запросах. Я наткнулся на этот вопрос, по которому хотел бы обратиться за помощью. Таким образом, существует таблица с именем сотрудника, зарплатой и датой зарплаты в столбцах. Дата-это просто год с 2015 по 2019 год. Я пытаюсь написать запрос, в котором я могу получить имя сотрудника с максимальным повышением зарплаты на % с 2018 по 2019 год. Я написал приведенный ниже запрос, но застрял на несколько часов в одном и том же.

     CREATE TABLE data (
      salary INTEGER NOT NULL,
      emp_name TEXT NOT NULL,
      Sal_Date YEAR NOT NULL
    );
    

INSERT INTO data VALUES (10000, 'Ryan', 2015);
INSERT INTO data VALUES (12000, 'Bryan', 2016);
INSERT INTO data VALUES (11000, 'Manthan', 2016);
INSERT INTO data VALUES (15000, 'Susan', 2017);
INSERT INTO data VALUES (16000, 'Alien', 2017);
INSERT INTO data VALUES (10000, 'Ryan', 2018);
INSERT INTO data VALUES (12000, 'Bryan', 2018);
INSERT INTO data VALUES (11000, 'Manthan', 2018);
INSERT INTO data VALUES (15000, 'Susan', 2018);
INSERT INTO data VALUES (16000, 'Alien', 2018);
INSERT INTO data VALUES (11000, 'Ryan', 2019);
INSERT INTO data VALUES (13000, 'Bryan', 2019);
INSERT INTO data VALUES (15000, 'Manthan', 2019);
INSERT INTO data VALUES (18000, 'Susan', 2019);
INSERT INTO data VALUES (32000, 'Alien', 2019);

SELECT salary  from data
    group by  ;
 

У меня нет никакой логики, чтобы решить эту проблему. Может ли кто-нибудь, пожалуйста, помочь с запросом и логическим объяснением. Я буду благодарен. Спасибо

Комментарии:

1. Я удалил конфликтующие теги СУБД. Верните один из них на место, тот, что предназначен для фактически используемой СУБД.

2. Можете ли вы также указать ожидаемый результат?

3. да, здесь Инопланетянин должен быть напечатан, так как я сделал 100% — ный рост с 2018 по 2019 год

4. пометьте свою базу данных

5. Какой продукт базы данных вы используете? Постгрес? Оракул? (хотя ни один из них не предлагает тип данных»год»)

Ответ №1:

 SELECT * , (salary - LAG(salary,1,salary) over (partition by emp_name order by sal_date)) /salary * 100 as promotionPercentage
from data 
order by emp_name , sal_date
 

бд<>скрипка <>здесь

Ответ №2:

Вы можете использовать самосоединение, чтобы присоединить таблицу к себе и вернуть зарплату за предыдущий год, затем сделать заказ по изменению зарплаты в % и вернуть первую

 SELECT TOP 1 t1.emp_name
FROM data t1
JOIN data t2 ON t1.emp_name = t2.emp_name AND t1.Sal_date = t2.Sal_Date   1
WHERE t1.Sal_Date = 2019
ORDER BY (t1.Sal_Date - t2.Sal_Date) / t2.Sal_Date * 100
 

В качестве альтернативы вы можете использовать функцию анализа запаздывания, но я не уверен, что она присутствует во всех СУБД?
Для этого я использую MSSQL

Ответ №3:

Вы можете самостоятельно присоединиться к таблице с условием, что:

  • такой же emp_name
  • первая таблица рассчитана на 2018 год, вторая-на 2019 год

Затем вы можете сравнить заработную плату в 2018 и 2019 годах в одном ряду. Вот пример запроса. Возможно, вам потребуется немного изменить в зависимости от вашего SQL-движка.

 SELECT
  d18.emp_name,
  cast(d19.salary AS FLOAT) / d18.salary - 1 AS hike_18_to_19
FROM
  data d18 
INNER JOIN
  data d19
ON
  d18.emp_name = d19.emp_name
  AND d18.Sal_Date = 2018
  AND d19.Sal_Date = 2019
ORDER BY 
  hike_18_to_19 DESC
 

Вы получаете что-то вроде этого:

   emp_name  hike_18_to_19
0    Alien       1.000000
1  Manthan       0.363636
2    Susan       0.200000
3     Ryan       0.100000
4    Bryan       0.083333