2016-03-24 22 views
1

私はタイムスタンプカラムを持つPostgreSQLのテーブルを持っています。そして、テーブルを修正して2番目のタイムスタンプカラムを持ち、直ちに連続するタイムスタンプの値を設定します。これを行う方法はありますか?テーブルはかなり大きいので、相関サブクエリはマシンを強制終了させる可能性があります。次の行の値を持つテーブルにカラムを追加する

は具体的に、私はこのから行きたい:

 
+----+------+   +----+------+------+ 
| ts | data |   | ts | te | data | 
+----+------+   +----+------+------+ 
| T | ... | --> | T | U | ... | 
| U | ... |   | U | V | ... | 
| V | ... |   | V | null | ... | 
+----+------+   +----+------+------+ 

は基本的に、私は時間クエリはるかに優れた(つまり、私の時間Xのためのデータを与える)に手をポイントにできるようにしたいです。

+1

からのデータは、あなたが連続したタイムスタンプを選択することはできませんか? –

+0

@vkp "select * from tab where x tab.tsとtab.teの間の"という形式のクエリを実行したいので、ある時点のデータの値を見つけることができます。各クエリの並べ替え/制限を行うのは本当に遅いでしょう。 – JasonN

+0

あなたは 'xの間にtab.tsとtab.ts + 1'をインスタンス化することができます。そうすれば、テーブルに格納する必要がなくなります。 –

答えて

1

基本的に私はあなただけのテーブルでそれを保存しない、問合せ時にタイムスタンプを取得することができると思いますが、あなたは、このようなアクションを実行している場合、これはあなたが必要なものであることを考える:

あなたがする必要がありますあなたのテーブルにその列を追加します。

ALTER TABLE tablename ADD COLUMN te timestamp; 

その後LEAD窓関数を使用して値を供給し、更新を行います。 SQL Fiddle:ここ

UPDATE tablename t 
SET te = x.te 
FROM (
    SELECT ts, lead(ts, 1) OVER (order by ts) AS te 
    FROM tablename t2 
) x 
WHERE t.ts = x.ts 

は、それがサンプル整数データを使用してどのように働くかの例です。

データ型の値がtimestampの場合とまったく同じです。

+0

ああ。ありがとう。 lead/lagはPostgreSQLのものですか?私は数年前にOracleの拡張機能から覚えています。そして、これはどのくらい苦しいでしょうか?今日のようなもので数億行以上走っている限り、私は満足しています。今からのインサートはテーブルを適切に保ちます。 – JasonN

+0

また、「OVER ...」が必要ですか?すべての行がタイムスタンプ順に挿入されましたが、主キーはありません。 – JasonN

+0

それは確かにしばらく時間がかかるでしょう。パフォーマンスを向上させるために 'ts'カラムにインデックスを作成してください。これはウィンドウ関数なので、OVERが必要です。それは構文です。いいえ、PostgreSQLだけではありません。これは、SQLServer、Oracleで使用されています...基本的に、ウィンドウ関数はANSI SQLです。 –

0

選択TS、LEAD(TS)TEとして((ヌルを選択)することによって順)以上のあなたは、それをテーブルに追加したいなぜ?クエリを実行する場合は、table_name

関連する問題