2016-03-03 4 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; 

Любая помощь будет принята с благодарностью, логически это должно быть правильным (может и нет), я Вероятно, просто испортил синтаксис каким-то образом.

Спасибо!

+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 

Идея заключается в первую сделать дорогой РЕГИСТРИРУЙТЕСЬ найти все различия в сроках (от s2s2 - от из s1), но только тогда, когда date_from равно rent_date, и даты не равны. (Разн = 0).

Второй внутренний выбор получает минимальное значение для каждого сотрудника, это, безусловно, первая акция.

Внешний выбор делает средний.

+0

@ Xexeo Эй, просто прочитайте это! Спасибо за понимание, практика делает совершенным. – LearningProcess

Смежные вопросы