首页 > 试题广场 >

查找员工编号emp_no为10001其自入职以来的薪水sal

[编程题]查找员工编号emp_no为10001其自入职以来的薪水sal
  • 热度指数:120812 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
查找员工编号emp_no为10001其自入职以来的薪水salary涨幅(总共涨了多少)growth(可能有多次涨薪,没有降薪)
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

输入描述:


输出描述:
growth
28841
示例1

输入

输出

select 28841 as growth
抖个机灵
发表于 2017-11-10 19:33:34 回复(50)

select套select 一个升序一个降序

SELECT ((SELECT salary from salaries 
where emp_no = 10001 order by from_date  desc limit 0, 1) - 
(SELECT salary from salaries 
where emp_no = 10001 order by from_date limit 0, 1)) AS growth;
发表于 2019-03-21 11:22:26 回复(6)
select max(salary)-min(salary) as growth from salaries
where emp_no='10001';
我认为这种思路是可以的:员工的工资通常情况都是非严格递增的。一般降薪,员工肯定会跳槽的。
发表于 2019-02-01 11:35:59 回复(8)
select 
(
(select salary from salaries 
 where emp_no = 10001
 order by to_date desc
 limit 1
 )
 -
(select salary from salaries
 where emp_no = 10001
 order by to_date asc
 limit 1
 )
)
 as growth;

发表于 2018-06-02 11:36:53 回复(0)

select((select salary from salaries

where emp_no=10001

order by to_date desc limit 0,1)-

(select salary from salaries

where emp_no=10001

order by from_date limit 0,1))

as growth

首先审题,查找的是薪水的涨幅值(其实不够严谨,应该说是涨幅偏离值,当然它表达的意思就是极差值啦),所有查询字段跟salary有关;涨幅值,即薪水最大值和薪水最小值之差,(与时间无直接的关系)所以入职时间和现在的时间无所有哪个条件,from_date 和to_date 仅仅是个时间条件而言。
发表于 2017-09-17 16:54:18 回复(0)
select max(salary) - min(salary) from salaries where emp_no = 10001
max(列名):求列最大值
max(列名):求列最小值
发表于 2017-08-29 19:40:43 回复(10)
select max(salary)-min(salary) from salaries where emp_no='10001'
发表于 2017-07-12 09:36:15 回复(3)
SELECT
    b.salary - a.salary growth 
FROM
    ( SELECT salary, min( to_date ) FROM salaries WHERE emp_no = 10001 ) a,
    ( SELECT salary, max( to_date ) FROM salaries WHERE emp_no = 10001 ) b
发表于 2018-07-05 16:58:59 回复(1)
本题这个 ‘涨幅’ 概念描述不清楚,有歧义
1、如果 ‘涨幅’ 定义为此员工在职期间达到的最大工资涨幅:
按照salary排序
select max(salary) - min(salary) as growth
from salaries
where emp_no = 10001
或者
select 
(select salary from salaries where emp_no = 10001 order by salary desc limit 1)
 - (select salary from salaries where emp_no = 10001 order by salary limit 1)
as growth
2、如果 ‘涨幅’ 定义为 截止目前为止此员工的工资涨幅
(按照to_date排序)
select 
(select salary from salaries where emp_no = 10001 order by to_date desc limit 1)
 - (select salary from salaries where emp_no = 10001 order by to_date limit 1)
as growth




编辑于 2018-11-29 13:29:47 回复(0)
题目不是太严谨,我觉得有两种思考方向:
1.获得最高涨幅值(可能连续好几个月涨),如果再考虑涨值和降值谁最高的话,那只要修改一下语句(把最后一个s2.salary-s1.salary>0去掉),再改成取绝对值最大就行了。
select max(s2.salary - s1.salary) as growth
from salaries s1
inner join salaries s2
on s1.emp_no = s2.emp_no and s2.to_date > s1.to_date
where s1.emp_no = '10001' and s2.salary - s1.salary > 0;

2.获得入职时的工资距离最新的工资的涨幅情况
select s4.salary-s1.salary as growth
from salaries s1
inner join (
    select min(s2.from_date) firstDate,max(s2.from_date) lastDate,s2.emp_no
    from salaries s2
    where s2.emp_no = '10001'
) s3
on s1.emp_no = s3.emp_no and s1.from_date = s3.firstDate
inner join salaries s4
on s3.emp_no = s4.emp_no and s3.lastDate = s4.from_date;
发表于 2018-01-23 13:47:18 回复(1)
SELECT MAX(salary)-MIN(salary)
from salaries
where emp_no='10001'
发表于 2020-10-08 20:08:57 回复(0)
SELECT (MAX(salary)-MIN(salary)) growth
FROM salaries
WHERE emp_no=10001
发表于 2020-09-13 19:24:23 回复(0)
select max(salary)- min(salary) as growth from salaries
where emp_no = "10001"

发表于 2020-09-08 11:10:53 回复(0)
-- 这个代码就是直接用最大值减去最小值了,应该算是振幅?
-- SELECT (MAX(salary)-MIN(salary)) AS growth 
-- FROM salaries WHERE emp_no = '10001'

-- 这个代码的意思好像是,按照to_date 的升序和降序,选出to_date的情况,也就是入职
-- 以内的情况,to_date 可以简单的理解为,入职了的时候的
-- 但是有意思的是,把这个改成from_date 代码一样是能够运行的
-- 所以也就是说,其实主要是因为这个表格只有给出了薪水--from--to这三行,没有具体给出
-- 薪水--from和薪水--to这样对应的关系,导致其实我们是不知道他这个薪水是指的是from时候
-- 的薪水,还是说to时候的薪水

-- 感觉这题最好改成两个薪水表,一个薪水是from的一个薪水是to的
SELECT ( 
(SELECT salary 
 FROM salaries 
 WHERE emp_no = 10001 
 ORDER BY from_date 
 DESC LIMIT 1) -
(SELECT salary 
 FROM salaries 
 WHERE emp_no = 10001 
 ORDER BY from_date 
 ASC LIMIT 1)
) AS growth
发表于 2020-08-31 10:53:05 回复(0)
🙄
发表于 2020-08-12 14:24:16 回复(0)
1、关键词:入职以来薪资增长
2、语句
select ((select salary 
from salaries
where emp_no = '10001'
order by to_date desc
limit 1)-(select salary
          from salaries
          where emp_no = '10001'
          order by from_date
          limit 1)) as growth
3、总结
本题主要考察对增长的理解,即入职以来至今的薪资变化。
注意:SQL语句未必一定要有from
发表于 2020-08-02 17:39:29 回复(0)
select max(salary)- min(salary) as growth from salaries 
where emp_no = 10001
group by emp_no
注意需要将员工根据emp_no分组之后再进行最大值和最小值的查询与运算
发表于 2020-05-10 15:29:58 回复(0)
select (salary2-salary1)  as growth
from (select first_value(salary) over (order by to_date asc) salary1,last_value(salary) over (order by to_date asc) salary2
from salaries
where emp_no='10001')
为什么这个执行不了
发表于 2019-12-10 18:15:16 回复(0)
SELECT 
(SELECT salary FROM salaries WHERE to_date=(SELECT MAX(to_date) FROM salaries WHERE emp_no=10001) AND emp_no=10001)
-salary growth
FROM
salaries
WHERE 
emp_no=10001
AND 
to_date=(SELECT MIN(to_date) FROM salaries WHERE emp_no=10001);
有个疑问,为什么员工的from_date(入职时间)不唯一?
发表于 2019-09-11 11:25:04 回复(2)
select (max(salary) - min(salary)) as growth from salaries where emp_no='10001'

easy
发表于 2019-07-18 04:19:33 回复(1)