sql >> データベース >  >> RDS >> PostgreSQL

Tablefuncを使用して複数の列をピボットする

    クエリの問題は、 b およびc 同じタイムスタンプを共有する2012-01-02 00:00:00 、そしてあなたはtimestampを持っています 列timeof クエリの最初なので、大胆な強調を追加したとしても、b およびc 同じグループに分類される単なる追加の列です2012-01-02 00:00:00 。最初の(b )が返されます(マニュアルを引用):

    row_name 列が最初である必要があります。 category およびvalue 列は、この順序で最後の2列である必要があります。 row_nameの間の列 およびcategory 「余分な」ものとして扱われます。 「余分な」列は同じであると予想されます 同じrow_nameを持つすべての行 値。

    大胆な強調鉱山。
    最初の2列の順序を逆にして、entityを作成します。 行名とそれは希望どおりに機能します:

    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 もちろん、一意である必要があります。

    繰り返します

    • row_name 最初
    • (オプション)extra
    • category (2番目のパラメーターで定義)およびvalue 最後

    最初から追加の列が入力されます 各row_nameからの行 パーティション。他の行の値は無視され、row_nameごとに1つの列しかありません 埋める。通常、これらは1つのrow_nameのすべての行で同じです。 、しかしそれはあなた次第です。

    回答のさまざまな設定について:

    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  -- ??!!
    

    テストのクエリがひどく実行されるのも不思議ではありません。テストセットアップには1400万行あり、すべてを処理します LIMIT 1000でそのほとんどを捨てる前にそれらの 。結果セットを減らすには、WHERE条件またはLIMITをソースクエリに追加してください!

    さらに、使用するアレイは、その上に不必要に高価です。代わりにdense_rank()を使用して代理行名を生成します。

    db<>フィドル ここでは、テストのセットアップが簡単で、行数が少なくなっています。



    1. GROUP BYを使用して、列を結合/連結します

    2. PostgreSQLでのクエリ最適化。 EXPLAINの基本–パート3

    3. データベースから接続文字列を取得する方法

    4. JDBCthinおよびJKSを使用したOracleDatabaseTLS1.2/SSL接続