1

empid、shiftdate、peerid を持つテーブル T1 があります。これには、従業員が誰かをトレーニングしたときの履歴が保存されます。たとえば、従業員ABCDの場合、これは私が持っているデータです:

EMPLOYEE|SHIFT_DATE|PEERID  
ABCD 05/10/2013 A123  
ABCD 05/09/2013 A123  
ABCD 05/08/2013 A123  
ABCD 05/07/2013 X456  
ABCD 05/06/2013 X456  
ABCD 05/05/2013 X456  
ABCD 05/04/2013 A123  
ABCD 05/03/2013 A123  
ABCD 05/02/2013 A123  
ABCD 05/01/2013 A123  

employee、trainee、trained_since(日付)を選択したい。上記のデータから、一部の研修生は、連続していない異なる日付/期間ブロックで繰り返すことができるため、次のように、各データ期間を個別のトレーニング期間として扱う必要があります。

EMPLOYEE|TRAINED_SINCE|TRAINEE  
ABCD 05/08/2013 A123  
ABCD 05/05/2013 X456  
ABCD 05/01/2013 A123  

どうすればいいですか?助けてください。

4

2 に答える 2

0

LAG境界を定義するために使用します。

SQL> SELECT employee, shift_date, peer_id
  2         CASE
  3            WHEN peer_id = lag(peer_id)
  4                           over(PARTITION BY employee ORDER BY shift_date)
  5            THEN
  6             0
  7            ELSE
  8             1
  9         END gap
 10    FROM DATA;

EMPLOYEE     SHIFT_DATE  PEER_ID             GAP
------------ ----------- ------------ ----------
ABCD         01/05/2013  A123                  1
ABCD         02/05/2013  A123                  0
ABCD         03/05/2013  A123                  0
ABCD         04/05/2013  A123                  0
ABCD         05/05/2013  X456                  1
ABCD         06/05/2013  X456                  0
ABCD         07/05/2013  X456                  0
ABCD         08/05/2013  A123                  1
ABCD         09/05/2013  A123                  0
ABCD         10/05/2013  A123                  0

これらの行を取得するには、外部クエリを使用します。

SQL> SELECT employee, shift_date since, peer_id
  2    FROM (SELECT employee, shift_date, peer_id,
  3                 CASE
  4                    WHEN peer_id = lag(peer_id)
  5                                   over(PARTITION BY employee
  6                                        ORDER BY shift_date)
  7                    THEN
  8                     0
  9                    ELSE
 10                     1
 11                 END gap
 12         FROM DATA)
 13  WHERE gap = 1;

EMPLOYEE     SINCE       PEER_ID
------------ ----------- ------------
ABCD         01/05/2013  A123
ABCD         05/05/2013  X456
ABCD         08/05/2013  A123
于 2013-05-24T16:14:24.100 に答える