2016-11-17 9 views
0

EmpID、FirstName、LastName、StartDate、およびEndDatesという列を持つemployees表を指定します。 私はOracleでクエリを使用して、社員が人数を変更しなくて済んだ最長期間を計算したいと考えています。従業員の人数を変更しないで最長の期間を計算するにはどうすればいいですか?

select MAX(endDate-startDate) 

from 
(select endDate 
from employees 
where endDate is not null) 

union all 

(select startDate 
from employees) 

しかし、私はエラーだ:ここで

は私のクエリです ORA-00904: "STARTDATE":無効な識別子

がどのように私はこのエラーを修正することができますか? 質問はこの質問の正しい答えですか?

おかげ

+0

構文エラーにかかわらず、 'enddate - startdate'は、従業員が会社にいた期間を計算します(そして、あなたはそれを超えて、誰かが会社にいる最長時間を取る)。会社が人員を変更していない最長の時間を知ることとは何か関係があります。とにかく間違ったことを計算するので、あなたが持っているものを修正しようとする価値はありません。 @Judy。 – mathguy

+0

。 。従業員が同じ日に出発して出発する場合に特に注意を払いながら、サンプルデータと望ましい結果を含めることによって、人数の変化が本当に意味するものを明確にする必要があります。 –

答えて

1

あなたは、サブクエリでたstartDateを返されていません。 startDateを内側のクエリに追加します。

select MAX(endDate-startDate) from 
(select startDate, endDate from employees where endDate is not null) 
union all 
(select startDate from employees) 

EDIT:

ます。また、これを試すことができます。それだけで最長の期間従業員をリストとして

select MAX(endDate-startDate) from employees where endDate is not null 

しかし、私はあなたのクエリはあなたが探しているものであるとは思いませんそれはもはや同社では機能しません。

1

単純な見方では、(人数が増えると)すべての開始日と終了日(減少したとき)をまとめて、それらをすべて組み合わせ、昇順で並べ替え、連続する日付間の差異、

「まとめて」はUNION ALLであり、「連続」日付間の測定差異は、解析関数lag()を使用して行うことができます。

1つの複雑さ:1人の従業員が他の従業員が終了した同じ日に正確に開始することができるため、人員は変更されません。より一般的には、与えられた日付には開始と終了があり、開始と終了の数が等しい場合は除外する必要があります。したがって、ソリューションの最初の部分はより複雑です。日付でグループ化し、開始カウントと終了カウントを比較する必要があります。

このような何かが(テストされていません!)働く可能性があります

with d (dt, flag) as (
     select start_date, 's' from employees union all 
     select end_date , 'e' from employees 
    ), 
    prep (int) as 
     select dt - lag(dt) over (order by dt) 
     from  d 
     group by dt 
     having count(case flag when 's' then 1 end) != 
               count(case flag when 'e' then 1 end) 
    ) 
select max(int) as max_interval 
from prep 
; 

編集 - ゴードンは彼の溶液中で良い点があります。おそらく人員の変化のない最長期間は、現在の期間(終了です"今")。このため、SYSDATEをUNION ALLに追加する必要があります。どちらかのフラグで追加することができます(具体的には 's'など)。私はあなたの質問への答えは、このようなものだと思います

+0

だから、もし誰かが同じ日に辞めて他の人が辞めたら、あなたは人数を変更しなかったと思いますか? –

+0

@JuanCarlosOropeza - はい。同じ日に8人が出発し、8人が出発した場合と同じです。私はコードの前のテキストでこれを説明しました。 – mathguy

+0

はい、読んで、理解しているかどうかを確認していました。私も同じことをしていましたが、私の場合は、8人の初心者と8人が出発した場合、私はその日に16人の人数変更を考えました。それぞれ長さ0日です。 ) –

0

:従業員が開始または停止したときに

select max(span) 
from (select (lead(dte) over (order by dte) - dte) as span 
     from (select startDate as dte from employees union all 
      select endDate as dte from employees union all 
      select trunc(sysdate) from dual 
      ) d 
    ) d; 

ヘッドカウントの変更(おそらく)が発生します。したがって、そのような2つの隣接する日付の間に最大の間隔が必要です。

+0

人事(中小企業経営)に関わっている私は、「人数の変化」は実際に変化を意味することが分かりました。 1人の従業員が同じ日に出発すると別の従業員が開始されますが、これは人数の変更とはみなされません。したがって、ソリューションはそれよりも複雑にする必要があります。 (それ以外の場合は、私の答えの最初の2つの段落で説明したものをコーディングしただけです) – mathguy

+0

sysdateの追加についての良い点 - 私はそれを逃しました。 – mathguy

+0

@mathguy。 。 。営業担当者は、人件費の変化が本当に何を意味するのかを明確にする必要があります。 –

関連する問題