Pivô em várias colunas usando o Tablefunc
Alguém já usoutablefunc
para girar em várias variáveis em oposição a usar apenasnome da linha? As notas de documentação:
Espera-se que as colunas "extras" sejam as mesmas para todas as linhas com o mesmo valor de row_name.
Não tenho certeza de como fazer isso sem combinar as colunas nas quais quero girar (o que duvido que me dê a velocidade de que preciso). Uma maneira possível de fazer isso seria tornar a entidade numérica e adicioná-la ao local como milissegundos, mas isso parece ser uma maneira instável de prosseguir.
Eu editei os dados usados em uma resposta a essa pergunta:Consulta de referência cruzada do PostgreSQL.
CREATE TEMP TABLE t4 (
timeof timestamp
,entity character
,status integer
,ct integer);
INSERT INTO t4 VALUES
('2012-01-01', 'a', 1, 1)
,('2012-01-01', 'a', 0, 2)
,('2012-01-02', 'b', 1, 3)
,('2012-01-02', 'c', 0, 4);
SELECT * FROM crosstab(
'SELECT timeof, entity, status, ct
FROM t4
ORDER BY 1,2,3'
,$VALUES (1::text), (0::text)$)
AS ct ("Section" timestamp, "Attribute" character, "1" int, "0" int);
Retorna:
Section | Attribute | 1 | 0 ---------------------------+-----------+---+--- 2012-01-01 00:00:00 | a | 1 | 2 2012-01-02 00:00:00 | b | 3 | 4
Então, como a documentação afirma, oextra coluna aka "Atributo" é assumido como sendo o mesmo para cadanome da linha aka "Seção". Assim, relatab para a segunda linha, embora 'entidade' também tenha um'c' valor para esse valor 'timeof'.
Saída desejada:
Section | Attribute | 1 | 0
--------------------------+-----------+---+---
2012-01-01 00:00:00 | a | 1 | 2
2012-01-02 00:00:00 | b | 3 |
2012-01-02 00:00:00 | c | | 4
Quaisquer pensamentos ou referências?
Um pouco mais de fundo: eu potencialmente preciso fazer isso parabilhões de linhas e estou testando armazenar esses dados em formatos longos e amplos e ver se posso usartablefunc
ir de um formato longo para um formato mais amplo do que com funções agregadas regulares.
Eu terei cerca de 100 medições feitas a cada minuto para cerca de 300 entidades. Frequentemente, precisaremos comparar as diferentes medições feitas para um dado segundo para uma dada entidade, então precisaremos ir para o formato amplo com muita frequência. Além disso, as medições feitas em uma entidade particular são altamente variáveis.
EDIT: eu encontrei um recurso sobre isso:http://www.postgresonline.com/journal/categories/24-tablefunc.