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