複数の列テーブルをキー名値タプルテーブル(postgresql)に変換する

私は多くのクエリを実行するのに30分かかることがありますが、これらのクエリの多くは20以上の列を返します(はい、正規化されています)。私はタイムスタンプ、名前、値の形式で単一のテーブルにこのデータをすべて格納することに興味があります。これは後でデータを自動化するためのものです。

しかし、私が返すクエリがあるとき

T1, V1t1, V2t1, V3t1
T2, V1t2, v2t2, v3t2
--   --    --    --

私はフォーマットでデータを持っていたい

T1, Name(V1), V1t1
T1, Name(V2), V2t1
T1, Name(V3), V3t1
T2, Name(V1), V1t2
T2, Name(V2), V2t2
T2, Name(V3), V3t2

私は知っている私は各値v1、v2とv3の選択で結合を行うことでこれを行うことができた、

しかし、私は速度に興味があり、3つのクエリを発行することを控えています。データを取得することはできますが(実際にはwroung形式)、実際の場合は20-30回のクエリを実行しないでください。 1。

だから問題は、一時的なテーブルにダンプすることと、後続の選択をテーブルの関連する列に実行して、それらを一緒に結合することから離れて行う方法です。

これは、カスタムビルドpostgresql関数で可能でしょうか?

前もって感謝します

4

2 答え

This is completely doable with a custom PostgreSQL function. You may also be able to use the tablefunc module and use the crosstab function to do what you want. It looks like you're trying to accomplish an unpivot in PostgreSQL, so you may get more use out of this mailing list thread Unpivot with PostgreSQL

2
追加された

あなたは次のクエリの変形であなたが望むものを達成することができます。

CREATE TABLE data
(
   sampleTime timestamptz,
   value1 numeric,
   value2 numeric,
   value3 numeric
);

INSERT INTO data(sampleTime,value1,value2,value3) values(now(),1,2,3);
INSERT INTO data(sampleTime,value1,value2,value3) values(now(),4,5,6);

SELECT data.sampleTime,
   CASE
      WHEN generate_series = 1 THEN 'value1'
      WHEN generate_series = 2 THEN 'value2'
      ELSE 'value3'
   END AS key,
   CASE
      WHEN generate_series = 1 THEN value1
      WHEN generate_series = 2 then value2
      ELSE value3 
   END AS value
FROM data,generate_series(1,3)
ORDER BY data.sampleTime,generate_series
2
追加された