Het probleem met uw vraag is dat b
en c
deel hetzelfde tijdstempel 2012-01-02 00:00:00
, en je hebt de timestamp
kolom timeof
eerst in je zoekopdracht, dus - ook al heb je vetgedrukte nadruk toegevoegd - b
en c
zijn gewoon extra kolommen die in dezelfde groep vallen 2012-01-02 00:00:00
. Alleen de eerste (b
) wordt geretourneerd sinds (onder verwijzing naar de handleiding):
De
row_name
kolom moet eerst zijn. Decategory
envalue
kolommen moeten de laatste twee kolommen zijn, in die volgorde. Alle kolommen tussenrow_name
encategory
worden behandeld als "extra". De "extra" kolommen zullen naar verwachting hetzelfde zijn voor alle rijen met dezelfderow_name
waarde.
Vetgedrukte nadruk van mij.
Keer gewoon de volgorde van de eerste twee kolommen om om entity
te maken de rijnaam en het werkt naar wens:
SELECT * FROM crosstab(
'SELECT entity, timeof, status, ct
FROM t4
ORDER BY 1'
,'VALUES (1), (0)')
AS ct (
"Attribute" character
,"Section" timestamp
,"status_1" int
,"status_0" int);
entity
moet natuurlijk uniek zijn.
Herhalen
row_name
eerste- (optioneel)
extra
kolommen volgende category
(zoals gedefinieerd door de tweede parameter) envalue
laatste .
Extra kolommen worden gevuld vanaf de eerste rij van elke row_name
partitie. Waarden uit andere rijen worden genegeerd, er is slechts één kolom per row_name
vullen. Meestal zijn die hetzelfde voor elke rij van één row_name
, maar dat is aan jou.
Voor de verschillende instellingen in je antwoord:
SELECT localt, entity
, msrmnt01, msrmnt02, msrmnt03, msrmnt04, msrmnt05 -- , more?
FROM crosstab(
'SELECT dense_rank() OVER (ORDER BY localt, entity)::int AS row_name
, localt, entity -- additional columns
, msrmnt, val
FROM test
-- WHERE ??? -- instead of LIMIT at the end
ORDER BY localt, entity, msrmnt
-- LIMIT ???' -- instead of LIMIT at the end
, $$SELECT generate_series(1,5)$$) -- more?
AS ct (row_name int, localt timestamp, entity int
, msrmnt01 float8, msrmnt02 float8, msrmnt03 float8, msrmnt04 float8, msrmnt05 float8 -- , more?
)
LIMIT 1000 -- ??!!
Geen wonder dat de query's in uw test vreselijk presteren. Uw testopstelling heeft 14 miljoen rijen en u verwerkt alle van hen voordat ze het meeste weggooien met LIMIT 1000
. Voeg voor een kleinere resultatenset WHERE-voorwaarden of een LIMIT toe aan de bronquery!
Bovendien is de array waarmee u werkt onnodig duur. Ik genereer in plaats daarvan een surrogaatrijnaam met density_rank().
db<>viool hier - met een eenvoudigere testopstelling en minder rijen.