【问题标题】:Select earliest hired employee from employee table从员工表中选择最早雇用的员工
【发布时间】:2012-01-05 22:55:27
【问题描述】:

我有一个员工表,其中的字段是:

first_name、last_name、hire_date、salary、department_id、department_name 等等。

我被要求找到最早雇用的员工。 max、sysdate、months_between这些函数我都知道,但是这里不知道怎么用?

我在想这个问题可以这样解决:

select e.first_name,max(e.hire_date)
from employees e

但它会产生以下错误:

 oRA-00937: not a single-group group function
    00937. 00000 -  "not a single-group group function"
    *Cause:    
    *Action:
    Error at Line: 1 Column: 7

所以请给我提示什么是正确的形式?

【问题讨论】:

    标签: sql oracle ora-00937


    【解决方案1】:

    这也可以: 如果您想在不使用联接的情况下显示数据以及员工姓名和雇用日期

    select emp_name as ELDER_EMPLOYEE,hire_date 
    from employees 
    where hire_date=(select min(hire_date) from employees)
    

    【讨论】:

      【解决方案2】:

      分析也可以:

      SELECT emp_name, hire_date
        FROM (SELECT first_name, hire_date
                   , dense_rank() OVER (ORDER BY hire_date) rnk
                FROM employees e)
       WHERE rnk = 1;
      

      【讨论】:

        【解决方案3】:

        最早是最小值,而不是最大值。

        order by 和 rownum 解决方案的替代路线

        select min(hire_date) as earliest_hire_date from employees
        

        这将获得最早的雇用日期。将其称为子查询并加入员工以获取您需要的其余信息

         select e.*, earliest_hire_date
         from (select min(hire_date) as earliest_hire_date from employees) a
         inner join employees e on e.hire_date = a.earliest_hire_date
        

        这里的内连接用作过滤器。这种方法的优点是,如果您在同一天雇用了多名员工,它将带回多行......该日期雇用的每个员工都有一个。

        如果没有内部连接你会更舒服,这是等效的:

        select e.*, earliest_hire_date
        from (select min(hire_date) as earliest_hire_date from employees) a, employees
        where e.hire_date = a.earliest_hire_date
        

        【讨论】:

          【解决方案4】:

          要查找最早雇用的员工:

           SELECT * FROM
           (
               SELECT * 
               FROM  employees
               ORDER BY hire_date
           )
           WHERE rownum = 1;
          

          如果您想要前 10 名最早入职的员工:

           SELECT * FROM 
           (
             SELECT * 
             FROM  employees
             ORDER BY hire_date
           )
           WHERE rownum <= 10;
          

          这是使用Oracle的伪列ROWNUM

          【讨论】:

          • 原始问题暗示了对 MAX 和 MIN 之间区别的混淆。值得注意的是,要获得最早的日期,它是ORDER BY hire_date ASC(上面的例子中隐含了ASC,意思是升序)或者要获得最新的日期,它是ORDER BY hire_date DESC
          • 您将如何处理在同一(最早)日期雇用的员工人数不确定的情况?我相信这种情况是我的解决方案效果更好的地方
          【解决方案5】:
          select * from employee 
          where 
          not exists 
          (select 1 from employee e2 where e2.hire_date < employee.hire_date)
          

          【讨论】:

          • 谢谢大家,但这里有一个问题我还没有研究过 rownum 和 subselect,所以我可以做其他吗?
          • 如果您可以确定只有一条记录具有最短雇佣日期,那么前 1 名会非常有用。如果有多个相同的日期,你需要这样的东西。
          • 其实你最后的评论是对的。我仅将问题阅读为“最短日期”,但重新阅读通知最早雇用的员工。我将删除我的第一条评论并予以纠正。 :) +1。
          猜你喜欢
          • 1970-01-01
          • 2012-01-10
          • 2014-07-29
          • 2017-06-24
          • 1970-01-01
          • 1970-01-01
          • 2021-08-07
          • 1970-01-01
          • 2018-01-26
          相关资源
          最近更新 更多