2012-10-04 184 views
0

我無法顯示每個部門最年輕的員工。MIN子句出現故障

還有一個名爲department的表格,它只是表示部門編號和部門名稱。我也嘗試了一個WHERE EXISTS子句,並且沒有運氣。

SELECT emp_department_number, 
      emp_name, 
      MIN(TRUNC(((current_date - emp_dateofbirth)/(365.25)))) "age" 
    FROM employee 
GROUP BY emp_department_number, emp_name 
ORDER BY emp_department_number; 

我也有這個,但它會產生相同的結果..

SELECT emp_department_number, emp_name, min(TRUNC(((current_date -  emp_dateofbirth)/(365.25)))) "age" from employee 
JOIN department 
ON dpt_num=emp_department_number 
WHERE EXISTS (select min(emp_dateofbirth) from employee) 
GROUP BY emp_department_number, emp_name 
order by emp_department_number; 



EMP_DEPARTMENT_NUMBER EMP_NAME      age 
-------------- ------------------------------ ---------- 
1    Ramon, Emma       25 
1    Tin, Rina        69 
3    Mason, John       68 
3    Roberson, Wayne      50 
3    Zan, Shelis       51 
7    Hockman, Ronnie      62 
7    Lam, Annie       37 
7    Smith, Ramon       60 

回答

1

由於您使用的是Oracle,因此您可以使用MONTHS_BETWEEN來計算確切的年齡。 爲了找到最年輕的人,您可以跳過年齡計算並直接使用emp_dateofbirth

SELECT emp_department_number, emp_name 
     , trunc(MONTHS_BETWEEN(emp_dateofbirth, current_date)/12) as age 
    from employee e 
    WHERE e.emp_dateofbirth = (
     SELECT MAX(emp_dateofbirth) 
      FROM employee x 
     WHERE x.emp_department_number = e.emp_department_number) 

您可以閱讀爲「對於每位員工,如果他的出生日期等於其部門的最大出生日期,則返回」。

0

如果我理解正確的話,你需要的是the FIRST_VALUE analytic function

SELECT emp_department_number, 
     emp_name, 
     TRUNC((CURRENT_DATE - emp_dateofbirth)/365.25) age 
    FROM employee 
WHERE emp_num IN 
     (SELECT FIRST_VALUE(emp_num) OVER 
        (PARTITION BY emp_department_number 
          ORDER BY emp_dateofbirth DESC 
        ) 
      FROM employee 
      GROUP 
       BY emp_department_number 
     ) 
; 
1

你可以這樣做與ROW_NUMBER()分析功能(我加入到潛在的加入部門表中以獲得名稱):

SELECT dept_name, empl, age 
FROM (
    SELECT EMP_DEPARTMENT_NUMBER AS dept, 
     EMP_NAME AS empl, 
     TRUNC((CURRENT_DATE - emp_dateofbirth)/365.25) AS age, 
     ROW_NUMBER() OVER (PARTITION BY EMP_DEPARTMENT_NUMBER ORDER BY emp_dateofbirth ASC) AS rn 
    FROM employee 
) E 
JOIN department d 
    ON e.dept = d.dept_id 
WHERE rn = 1