java,oracle面试题,如下,sql怎么写

2025-02-25 21:19:14
推荐回答(1个)
回答1:

如题我先进行分析:  

  1. 第一句话中 按月找出平均 填写时间大于3天的人员信息 :

    那么可用理解为 根据月份查找 员工平均延迟填写日期大于3天的 人员信息。

  2. 第二句话一个人员的日志填写日期有多条则取最早的一条,如果有一天未填写,则取系统当前时间,不含小时。

    以上这句话需要注意两点 第一点,取最早的一条此处需要用到 ROW_NUMBER() OVER() 以及未填写 则取系统当前时间 不含小时 那么取值格式应为yyyy-mm-dd此处需要处理格式。

根据以上分析提供如下SQL:  注:(以下SQL已ORACLE为例)

--创建临时表 存储数据
with  emp_log as(
select 1 as empno ,'张一' as empname, '工作内容1' as workcontent, date'2017-03-20' as begdate, date'2017-03-23' as entrydate, 1 as num from dual
union all
select 1 as empno ,'张一' as empname, '工作内容2' as workcontent, date'2017-03-20' as begdate, date'2017-03-23' as entrydate, 2 as num from dual
union all
select 1 as empno ,'张一' as empname, '工作内容3' as workcontent, date'2017-03-20' as begdate, date'2017-03-24' as entrydate, 5 as num from dual
union all
select 1 as empno ,'张一' as empname, '工作内容1' as workcontent, date'2017-03-24' as begdate, date'2017-03-30' as entrydate, 8 as num from dual
union all
select 2 as empno ,'张二' as empname, '工作内容2 1' as workcontent, date'2017-03-20' as begdate, date'2017-03-30' as entrydate, 8 as num from dual
union all
select 2 as empno ,'张二' as empname, '工作内容2 2' as workcontent, date'2017-03-25' as begdate, date'2017-03-28' as entrydate, 8 as num from dual
union all
select 3 as empno ,'张三' as empname, '工作内容3 1' as workcontent, date'2017-03-20' as begdate,  null as entrydate, null as num from dual
union all
select 3 as empno ,'张三' as empname, '工作内容3 2' as workcontent, date'2017-03-20' as begdate,  null as entrydate, null as num from dual
union all
select 4 as empno ,'张四' as empname, '工作内容4 2' as workcontent, date'2017-03-25' as begdate,  date'2017-03-28' as entrydate, 8 as num from dual
)
select * from (
select empno,empname,sum(num) num,sum(yanci)/count(empno) pingjunyanci --获取人员当月总延迟数 除去 当月人员 每日的打开数  计算出当月每天的平均延迟天数
  from (select ROW_NUMBER() OVER(PARTITION BY e.empno,e.begdate ORDER BY e.empno,e.begdate) AS RN,--排序获取当天有多条记录 并在后面条件中获取第一条
               e.empno,e.empname,
               e.workcontent,e.begdate,
               e.entrydate,
               e.num,
               (nvl( e.entrydate,to_date(to_char(sysdate, 'yyyy-mm-dd'), 'yyyy-mm-dd') )-begdate) as yanci --判断如果没有填写结束日期 那么以系统当前日期进行运算 延迟日期
          from emp_log e) e1
 where e1.rn=1 --获取第一条
 and to_char(begdate,'yyyy-mm') = '2017-03'  --可用的月份条件
 group by empno,empname,num order by empno       --根据人员工号 、人员姓名分组汇总
 ) e2 where e2.pingjunyanci>3;
 
-- 分析不易忘认真阅读后采纳,有其他问题请追问我。