最近在我的一次采访中,我被问到了问题
写一个查询,找到前3个月部门休假最少的员工。
表结构是
EMPID | TO_DATE | FROM_DATE | LEAVE _TYPE | DEPT_NO
我能够编写查询
SELECT
min(days) FROM (SELECT id ,(sum((TO_DATE-FROM_DATE)+1) ) days ,dept
FROM emp_leave
WHERE to_date between ADD_MONTHS(sysdate,-3) AND sysdate group by id,dept)
group by dept ;
但是当我尝试选择emp_id
时,我必须在group by语句中添加它。
我被困在那里。
答案 0 :(得分:2)
我认为查询应该是
select dept, min(id) keep (dense_rank last order by days)
from ( SELECT id ,
(sum((TO_DATE-FROM_DATE)+1) ) days ,
dept
FROM emp_leave
WHERE to_date between ADD_MONTHS(sysdate,-3)
AND sysdate group by id,dept)
group by dept
;
当然,在SQL中你有很多不同的方法可以做到这一点,但是当它是关于排序的东西时,第一个/最后一个函数是非常有用的
答案 1 :(得分:1)
试试这个
SELECT id
,(sum((TO_DATE - FROM_DATE) + 1)) days
,dept
FROM emp_leave
WHERE to_date BETWEEN ADD_MONTHS(sysdate, - 3)
AND sysdate
GROUP BY id
,dept
ORDER BY days LIMIT 1