2016-03-03 37 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