Превращение таблицы с несколькими столбцами в таблицу кортежей значения имени ключа в postgresql - PullRequest
4 голосов
/ 25 ноября 2011

У меня большое количество запросов, для выполнения некоторых из которых может потребоваться полчаса, многие из этих запросов возвращают более 20 столбцов (да, они нормализованы). Я заинтересован в хранении всех этих данных в одной таблице, в формате Timestamp, name, value, резонанс для этого - для последующей автоматизации данных.

Однако, когда у меня есть запрос, который возвращает

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) за один раз. быть сделано в одном.

поэтому вопрос в том, есть ли способ сделать это, кроме выгрузки во временную таблицу и запуска последующих выборок в соответствующие столбцы таблицы и их объединения ...

было бы это возможно с помощью встроенной функции postgresql?

заранее спасибо

Ответы [ 2 ]

2 голосов
/ 01 января 2012

Вы можете достичь желаемого с помощью варианта следующего запроса.

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 голосов
/ 25 ноября 2011

Это полностью выполнимо с помощью пользовательской функции PostgreSQL.Вы также можете использовать модуль tablefunc и использовать функцию crosstab , чтобы делать то, что вы хотите.Похоже, вы пытаетесь выполнить удаление в PostgreSQL, поэтому вы можете получить больше пользы от этого потока списка рассылки Удалить с PostgreSQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...