PostgreSQLスキルアップノート(自己啓発のための個人サイト)
連続生成関数「generate_series」
【一覧に戻る】
マニュアルへのリンクは9.2としています。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ 連続生成関数「generate_series」
■■■■
■■■■
■■■■ 2013/03/02
■■■■ 使用環境:PostgreSQL9.1.7 (CentOS6.2)
(C) 2013 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
連続データを生成する関数。
数値だけでなくタイムスタンプの連続データ生成も可能。
【マニュアル】
→●[マニュアル]
【マニュアル参考】
−
【その他】
−
■1■ 数値の連続生成
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
数値の場合はint型,bigint型に対応。
generate_series(開始値,終了値 [,間隔])
【□】 select * from generate_series(1,10);
【□】 select generate_series(1,10);
結果はいずれも以下の通り
generate_series
-----------------
1
2
3
4
5
6
7
8
9
10
(10 行)
【□】 select * from generate_series(10,-10,-6);
generate_series
-----------------
10
4
-2
-8
(4 行)
■2■ タイムスタンプの連続生成
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
タイムスタンプの場合はtimestamp または timestamp with time zoneに対応。
generate_series(開始値,終了値,時間間隔)
【□】 select generate_series('2013-03-01 00:00:00'::timestamp,'2013-03-02 23:00:00','3 hours');
generate_series
---------------------
2013-03-01 00:00:00
2013-03-01 03:00:00
2013-03-01 06:00:00
2013-03-01 09:00:00
2013-03-01 12:00:00
2013-03-01 15:00:00
2013-03-01 18:00:00
2013-03-01 21:00:00
2013-03-02 00:00:00
2013-03-02 03:00:00
2013-03-02 06:00:00
2013-03-02 09:00:00
2013-03-02 12:00:00
2013-03-02 15:00:00
2013-03-02 18:00:00
2013-03-02 21:00:00
(16 行)
■3■ 高速なテーブル格納
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
高速で手軽に使えるので検証時のテストデータの生成にも使う。
【□】
drop table t1;
CREATE temp TABLE t1 (c1 int primary key,c2 timestamp,c3 int);
\timing on
INSERT INTO t1
SELECT
row_number() over(),
g.*,
-- trunc((random() * 1000000)::numeric,0)
floor(random() * 1000000) -- 0から999999までの値
FROM
generate_series(current_timestamp,current_timestamp+'20 years','1 minutes') g
limit 1000000;
時間: 5481.346 ms
truncは8秒以上かかる。floorの方がかなり速い。
以上