#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