2016-03-03 67 views
1

因此,我试图找到员工从招聘时间起加薪的平均时间。日期差异总和的平均值。MySQL

我已经尝试了一些东西,但我没有弄清楚。

这里是我的数据库是什么样子: 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; 

任何帮助将不胜感激,按理这应该是正确的(也许不是),我'm可能只是搞乱语法一些如何..

谢谢!

+2

时间阅读关于加入我怀疑 – Strawberry

+0

其实,与以下提供的答案相反,我认为这个问题是不可解决的。因为salaries.emp_no是主键,所以我们只能知道雇用日期以及最近工资增长的日期。有了这些信息,我们只能看出招聘和最近薪资增长之间的平均时间,这不是你想知道的(因为这是一个毫无意义的统计数据)。如果PK是在(emp_no,from_date)上形成的,那么问题就会变得微不足道。 – Strawberry

回答

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) 

    ; 

这种类型的分析需要大量的分析和数据质量验证,但。对于这种类型的数据,我不太相信日期条件。

+0

这里有相当多的查询。 – Strawberry

+0

@Strawberry欢迎您减少。这是我认为需要的。 – Bulat

+0

我可能在早上。现在我迟到了。 – Strawberry

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)。

第二个内部选择获得每个员工的最小值,这肯定是第一次晋升。

外部选择使平均值。

+0

@ Xexeo嘿,刚刚阅读!感谢有识之士,实践完美。 – LearningProcess