ダミーデータの作り方 スケジュールデータ編 2015年12月4日

ネットスクエアの永田です。

今回はスケジュールのダミーデータを一括作成する方法についての紹介です。

ここでの「スケジュール」とは、「 開始日時と終了日時を持ち、特定のユーザに属する情報 」という定義にします。
グループウェアのスケジュール情報や、予約管理システムにおける予約情報などを思い浮かべてもらえたらと思います。

[前提条件]

使用するデータベース/テーブル、作成するスケジュールの内容については下記の通りとします。

  • データベースはPostgreSQL 9.4
  • ユーザ(users)とスケジュール(schedules)の各テーブルのレイアウトは以下の通り
    create table users (
        user_id serial not null         -- ユーザーID
      , name character varying(30)      -- 名
      , constraint users_pk primary key (user_id)
    );
    create table schedules (
        schedule_id serial not null     -- スケジュールID
      , user_id integer not null        -- ユーザーID
      , start_date timestamp not null   -- 開始日時
      , end_date timestamp not null     -- 終了日時
      , constraint schedules_pk primary key (schedule_id)
    );
  • ユーザのデータは以下の3件を用意
    INSERT INTO users(name) VALUES('前田');
    INSERT INTO users(name) VALUES('大瀬良');
    INSERT INTO users(name) VALUES('ジョンソン');
  • スケジュールの作成対象期間は2015/12/1~2015/12/31で、各日9時から18時までの範囲で30分間隔に敷き詰めるように作成
  • スケジュールは全ユーザに対して作成

[作成方法]

データの作成にはPL/pgSQLを利用し、コードの実行についてはWindows環境のpgAdmin IIIを使用します。

データ作成を行うコードは下記になります。

DO $$
DECLARE
  d   DATE;       -- 日付
  t   TIMESTAMP;  -- 時刻
  u   RECORD;     -- ユーザのレコード
BEGIN
 -- ① 12/1から12/31まで1日ごとのループ
 FOR d IN SELECT generate_series('2015-12-01'::DATE, '2015-12-31'::DATE, '1 day') AS d LOOP 
   -- ② 9時から17時半まで30分ごとのループ
   FOR t IN SELECT generate_series(d + interval '9 hour', d + interval '17 hour 30 minute', '30 minute') AS t LOOP
     -- ③ ユーザ1人ごとのループ
     FOR u IN SELECT * FROM users ORDER BY user_id LOOP
       -- ④ INSERT文の実行
       EXECUTE 'INSERT INTO schedules (user_id, start_date, end_date) VALUES (' || u.user_id || ',''' || t || ''', ''' || t + interval '30 minute' || ''')';
     END LOOP;
   END LOOP;
 END LOOP;
END$$ language plpgsql;


上記のコードを簡単に解説すると、
①でgenerate_series関数で12/1から12/31までのレコードを作成してループ、
②でgenerate_series関数とintervalを使用して各日の9時から17時半までのレコードを作成してループ、
③で全ユーザを取得してループ、
④で開始時刻は②の時刻にして終了時刻は②の時刻の30分後にしたスケジュールデータをINSERT
ということをやっています。

 このコードの実行で1674件(31日 × 9時間 × 2分割 × 3人)のスケジュールデータが作成できます。

上記のコードでは隙間なく敷き詰めるようにデータを作成しましたが、IF文を追加することで
①のループで土日はスキップさせたり、②のループで昼休みの時間についてはスキップさせたり、
random関数を使って閾値未満の場合はスキップして作成間隔をまばらにさせたり、
といったコントロールができるかと思います。

以上、今回はスケジュールデータを題材にしましたが、
PL/pgSQLを使うと手続き処理ができるので、他のデータの作成にも応用できると思います。
ぜひ色々と試してみてください。

Comments are closed.