因此,我试图找到员工从招聘时起加薪所需的平均时间。
我尝试了一些事情,但我没有做对。
这是我的数据库的样子: https://dev.mysql.com/doc/employee/en/sakila-structure.html
这是我尝试过的:
SELECT AVG(SUM(datediff(hire_date, min((SELECT from_date FROM salaries
WHERE from_date > hire_date AND
(SELECT salary FROM salaries
WHERE from_date = hire_date) <
(SELECT salary FROM salaries
WHERE from_date > hire_date))))))
FROM employees;
任何帮助都会非常感激,从逻辑上说这应该是正确的(也许不是),我可能只是弄乱语法一些如何...
谢谢!
答案 0 :(得分:1)
这不是一个简单的查询,但可能是您自己尝试找到它,并在此过程中学习了很多SQL。
在实际的系统开发情况下,如果SQL过于繁重或复杂,有时程序员更容易进行更多查询,使用存储过程或用编程语言解决它。
但是,作为一种帮助,我相信这会成为诀窍:
select avg(md) from (
select emp_no, min(days) as md from
(select s1.emp_no as emp_no,
s1.from_date as start,
datediff(s2.from_date,s1.from_date) as days
from employees e inner join salaries s1 on
e.emp_no=s1.emp_no
inner join salaries s2 on s1.emp_no=s2.emp_no
where
s2.from_date <> s1.from_date and
s1.from_date < s2.from_date and
s1.from_date = e.hire_date
) t ) tt group by emp_no
这个想法是先做一个昂贵的JOIN来找到日期的所有差异(来自s2s2 - 来自s1),但只有当date_from等于hire_date并且日期不相等时。 (差异= 0)。
第二个内部选择获得每个员工的最小值,这肯定是第一个促销。
外部选择是平均值。
答案 1 :(得分:0)
这就是我如何做到这一点来制作你想要明确的事情:
SELECT AVG(datediff(e.hire_date, second_salary.from_date))
FROM
employees e INNER JOIN
salaries first_salary ON e.emp_no = first_salary.emp_no AND
first_salary.from_date = e.hire_date INNER JOIN
salaries second_salary ON e.emp_no = second_salary.emp_no AND
second_salary.from_date > e.hire_date AND
second_salary.salary > frist_salary.salary AND
NOT EXISTS (SELECT * FROM salaries s
WHERE s.emp_no = e.emp_no AND
s.from_date > e.hire_date AND
s.from_date < second_salary.from_date AND
s.salary > first_salary.salary)
;
这种类型的分析需要大量的分析和数据质量验证。对于这类数据,我不太相信日期条件。