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_namekolom moet eerst zijn. Decategoryenvaluekolommen moeten de laatste twee kolommen zijn, in die volgorde. Alle kolommen tussenrow_nameencategoryworden behandeld als "extra". De "extra" kolommen zullen naar verwachting hetzelfde zijn voor alle rijen met dezelfderow_namewaarde.
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_nameeerste- (optioneel)
extrakolommen volgende category(zoals gedefinieerd door de tweede parameter) envaluelaatste .
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.