クエリの問題は、 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<>フィドル ここでは、テストのセットアップが簡単で、行数が少なくなっています。