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の方がかなり速い。




以上 
inserted by FC2 system