Problem z zapytaniem polega na tym, że b i c udostępnij ten sam znacznik czasu 2012-01-02 00:00:00 i masz timestamp kolumna timeof najpierw w zapytaniu, więc - mimo dodania pogrubionego podkreślenia - b i c to tylko dodatkowe kolumny należące do tej samej grupy 2012-01-02 00:00:00 . Tylko pierwszy (b ) jest zwracane, ponieważ (powołując się na instrukcję):
row_name kolumna musi być pierwsza. category i value kolumny muszą być dwiema ostatnimi kolumnami w tej kolejności. Dowolne kolumny między row_name i category traktowane są jako „dodatkowe”. „Dodatkowe” kolumny oczekuje się, że będą takie same dla wszystkich wierszy o tej samej row_name wartość.
Pogrubiony nacisk na kopalnię.
Po prostu odwróć kolejność pierwszych dwóch kolumn, aby utworzyć entity nazwę wiersza i działa zgodnie z potrzebami:
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 musi być oczywiście wyjątkowy.
Powtórz
row_namepierwszy- (opcjonalnie)
extrakolumny następne category(zgodnie z drugim parametrem) ivalueostatni .
Dodatkowe kolumny są wypełniane od pierwszego wiersz z każdego row_name przegroda. Wartości z innych wierszy są ignorowane, jest tylko jedna kolumna na row_name wypełnić. Zazwyczaj byłyby to takie same dla każdego wiersza jednego row_name , ale to zależy od Ciebie.
Dla innej konfiguracji w Twojej odpowiedzi:
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 -- ??!!
Nic dziwnego, że zapytania w twoim teście działają fatalnie. Twoja konfiguracja testowa ma 14 mln wierszy i przetwarzasz wszystkie z nich przed wyrzuceniem większości z LIMIT 1000 . Aby uzyskać ograniczony zestaw wyników, dodaj warunki WHERE lub LIMIT do zapytania źródłowego!
Ponadto macierz, z którą pracujesz, jest niepotrzebnie droga. Zamiast tego generuję zastępczą nazwę wiersza za pomocą gęstości_rank().
db<>skrzypce tutaj - z prostszą konfiguracją testową i mniejszą liczbą wierszy.