Problém s vaším dotazem je, že b a c sdílet stejné časové razítko 2012-01-02 00:00:00 a máte timestamp sloupec timeof první ve svém dotazu, takže – i když jste přidali tučné zvýraznění – b a c jsou pouze další sloupce, které spadají do stejné skupiny 2012-01-02 00:00:00 . Pouze první (b ) je vráceno od (s citací návodu):
row_namesloupec musí být první.categoryavaluesloupce musí být poslední dva sloupce v tomto pořadí. Jakékoli sloupce mezirow_nameacategoryjsou považovány za „extra“. Sloupce "navíc" očekáváme, že budou stejné pro všechny řádky se stejnýmrow_namehodnotu.
Tučné zdůraznění min.
Stačí změnit pořadí prvních dvou sloupců a vytvořit entity název řádku a funguje podle potřeby:
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 musí být samozřejmě jedinečné.
Opakujte
row_nameprvní- (volitelné)
extrasloupce další category(jak je definováno druhým parametrem) avalueposlední .
Další sloupce se vyplňují od prvního řádek z každého row_name rozdělit. Hodnoty z jiných řádků jsou ignorovány, každý row_name má pouze jeden sloupec vyplnit. Obvykle by byly stejné pro každý řádek jednoho row_name , ale to je na vás.
Pro různé nastavení ve vaší odpovědi:
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 -- ??!!
Není divu, že dotazy ve vašem testu fungují strašně. Vaše testovací nastavení má 14 milionů řádků a vy zpracujete všechny z nich, než většinu vyhodíte s LIMIT 1000 . Chcete-li snížit sadu výsledků, přidejte do zdrojového dotazu podmínky WHERE nebo LIMIT!
Navíc pole, se kterým pracujete, je zbytečně drahé. Místo toho generuji náhradní název řádku pomocí dense_rank().
db<>housle zde – s jednodušším testovacím nastavením a menším počtem řádků.