4

フィールドが次の従業員テーブルがあります。

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

では、正しい形になるヒントを教えてください。

4

5 に答える 5

9

最初に雇用された従業員を検索するには:

 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

于 2011-11-24T21:40:59.667 に答える
4

最大ではなく、最も早い場合は最小になります。

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

ここでは、内部結合がフィルターとして機能します。この方法の利点は、同じ日に複数の従業員を雇用した場合、その日に雇用された従業員ごとに 1 つの複数の行が返されることです。

内部結合を使用しない方が快適な場合、これは同等です。

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
于 2011-11-24T22:49:41.923 に答える
3
select * from employee 
where 
not exists 
(select 1 from employee e2 where e2.hire_date < employee.hire_date)
于 2011-11-24T21:40:29.890 に答える
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;
于 2011-11-24T23:03:54.773 に答える