ページ

2013年12月15日日曜日

postgresで連番のテストデータを作成

SQLの検証をしたくてテストデータを作成しようと
思ったのですが良い方法がないか検討しまとめました。

今回は親のテーブルに対して、1日毎にレコードが付く構造です。
以下テーブル用のSQLになります
-- サイト情報
CREATE TABLE site (
 site_id SERIAL,
 site_name TEXT,
 PRIMARY KEY(site_id)
);

-- サイト履歴
CREATE TABLE site_view (
 site_id NUMERIC(19, 0),
 date TIMESTAMP,
 view NUMERIC(19, 0), --  view数
 conversion NUMERIC(19, 0), -- コンバージョン数
 PRIMARY KEY(site_id, date)
);

サイトとサイトに対するview数とコンバージョン数のデータです。
Googleアナリティクスのデータみたいなものを集計したいのでこのような名称ですw

今回はこちらの2テーブルに以下の条件でデータを入れます.
1.siteテーブルには1000件のサイト情報を入れる.
2.siteテーブルには連番でサイト名を登録.
3.site_viewには過去1年間のレコードを入れる.
4.site_view#viewには必ず毎日1以上のレコードが存在する.
5.site_view#conversionには、view以下の数値が入る.
以上の条件で生成します。

-- 1000件のサイト情報を作成します。
INSERT INTO site(site_name) SELECT 'site' || generate_series(1, 1000);

-- 1年分のテストレコードの作成
INSERT INTO site_view(site_id, date, view) SELECT site_id, (current_date - (generate_series(1, 365) || ' days')::INTERVAL) AS date, TRUNC(random() * 1000) AS view FROM site;

-- 1年分のconversionデータの作成
UPDATE site_view SET conversion = TRUNC(random() * view);
これで完了です。
generate_seriesを利用することで連番が作成できるのでこの機能を利用しました
またgenerate_seriesを利用し日付を1年間-1ずつすることで簡単に1年分の日付を1行で
記載が可能です。