sql >> Database >  >> RDS >> PostgreSQL

Draaien op meerdere kolommen met Tablefunc

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. De category en value kolommen moeten de laatste twee kolommen zijn, in die volgorde. Alle kolommen tussen row_name en category worden behandeld als "extra". De "extra" kolommen zullen naar verwachting hetzelfde zijn voor alle rijen met dezelfde row_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) en value 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.



  1. Waarom komt de varchar-sorteervolgorde van Oracle niet overeen met het gedrag van varchar-vergelijking?

  2. Oracle SQL:Kolom niet toegestaan

  3. Kolomnaam Oracle-tabel met spatie

  4. postgreSQL mysql orakel verschillen