日期差异总和的平均值.. MySQL

时间:2016-03-03 22:35:35

标签: mysql sql

因此,我试图找到员工从招聘时起加薪所需的平均时间。

我尝试了一些事情,但我没有做对。

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

任何帮助都会非常感激,从逻辑上说这应该是正确的(也许不是),我可能只是弄乱语法一些如何...

谢谢!

2 个答案:

答案 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)

    ;

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