思ったのですが良い方法がないか検討しまとめました。
今回は親のテーブルに対して、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行で
記載が可能です。