2

開始日と終了日の従業員リストがあります。マネージャーが変わるたびに、新しいラインが生成されます。私は、1 年間を通して毎月、彼らの部署が何だったのかを把握しようとしています。

データは次のとおりです。

EMP_ID  startdate   enddate     staffgroup
494694  2012-05-24  2013-01-09  Service
494694  2013-01-09  2013-02-03  Service
494694  2013-02-03  2013-02-04  Service
494694  2013-02-04  2013-02-05  Service
494694  2013-02-05  2013-02-07  Service
494694  2013-02-07  2013-02-15  Service
494694  2013-02-15  2013-03-20  Service
494694  2013-03-20  2013-06-01  Service
494694  2013-06-01  2013-06-03  Manager
494694  2013-06-03  2013-07-01  Manager
494694  2013-07-01  2099-12-31  Manager

予想された結果

EMP_ID  Month       staffgroup
494694  2013-01-01  Service
494694  2013-02-01  Service
494694  2013-03-01  Service
494694  2013-04-01  Service
494694  2013-05-01  Service
494694  2013-06-01  Manager
494694  2013-07-01  Manager
4

2 に答える 2

1

必要なすべての月を含む DATE_HELPER テーブルを作成します。

the_date
2013-01-01
2013-02-01
...
2013-12-01

次に、各月の開始前にその人が持っていた最後のスタッフグループが必要なようです。

         SELECT e.EMP_ID, max(e.startdate), dh.the_date
           FROM DATE_HELPER dh
LEFT OUTER JOIN RAW_EMP_DATA e on (e.startdate <= dh.the_date)
       GROUP BY EMP_ID, dh.the_date

Results:
EMP_ID  startdate   the_date
494694  2012-05-24  2013-01-01
494694  2013-01-09  2013-02-01
494694  2013-02-15  2013-03-01
494694  2013-03-20  2013-04-01
494694  2013-03-20  2013-05-01
494694  2013-06-01  2013-06-01
494694  2013-07-01  2013-07-01
494694  2013-07-01  2013-08-01
494694  2013-07-01  2013-09-01
494694  2013-07-01  2013-10-01

これにより、関心のあるすべての関連する開始日が得られます。したがって、元のテーブルに参加して、staffgroup を取得します。

    SELECT red.EMP_ID, X.the_date as Month, red.staffgroup
      FROM RAW_EMP_DATA red
INNER JOIN (
         SELECT e.EMP_ID, max(e.startdate), dh.the_date
           FROM DATE_HELPER dh
LEFT OUTER JOIN RAW_EMP_DATA e on (e.startdate <= dh.the_date)
       GROUP BY EMP_ID, dh.the_date
           ) X on (X.EMP_ID = red.EMP_ID and X.startdate = red.startdate)

Results:
EMP_ID  Month       staffgroup
494694  2013-01-01  Service
494694  2013-02-01  Service
494694  2013-03-01  Service
494694  2013-04-01  Service
494694  2013-05-01  Service
494694  2013-06-01  Manager
494694  2013-07-01  Manager
494694  2013-08-01  Manager
494694  2013-09-01  Manager
494694  2013-10-01  Manager
于 2013-11-01T23:24:14.397 に答える
0

何かのようなもの:

SELECT EXTRACT( YEAR_MONTH FROM startdate ) 

FROM  `employee` 

2013 年 10 月の場合は '201310' が返されます

于 2013-10-12T23:44:24.477 に答える