आपकी क्वेरी के साथ समस्या यह है कि b
और c
समान टाइमस्टैम्प साझा करें 2012-01-02 00:00:00
, और आपके पास timestamp
. है कॉलम timeof
आपकी क्वेरी में सबसे पहले, इसलिए - भले ही आपने बोल्ड जोर जोड़ा हो - b
और c
केवल अतिरिक्त कॉलम हैं जो एक ही समूह में आते हैं 2012-01-02 00:00:00
. केवल पहला (b
) तब से वापस आ गया है (मैनुअल को उद्धृत करते हुए):
row_name
कॉलम पहले होना चाहिए। category
और value
कॉलम उस क्रम में अंतिम दो कॉलम होने चाहिए। row_name
. के बीच कोई भी कॉलम और category
"अतिरिक्त" के रूप में माना जाता है। "अतिरिक्त" कॉलम समान होने की उम्मीद है समान row_name
. वाली सभी पंक्तियों के लिए मूल्य।
बोल्ड जोर मेरा।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
(जैसा कि दूसरे पैरामीटर द्वारा परिभाषित किया गया है) औरvalue
अंतिम ।
पहले . से अतिरिक्त कॉलम भरे गए हैं प्रत्येक row_name
. से पंक्ति विभाजन। अन्य पंक्तियों के मानों पर ध्यान नहीं दिया जाता है, प्रति row_name
. में केवल एक स्तंभ होता है भरना। आमतौर पर वे एक 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 -- ??!!
कोई आश्चर्य नहीं कि आपके परीक्षण में प्रश्न बहुत अच्छा प्रदर्शन करते हैं। आपके परीक्षण सेटअप में 14M पंक्तियाँ हैं और आप सभी को संसाधित करते हैं उनमें से अधिकांश को LIMIT 1000
. के साथ फेंकने से पहले . कम परिणाम सेट के लिए स्रोत क्वेरी में WHERE शर्तें या LIMIT जोड़ें!
साथ ही, जिस सरणी के साथ आप काम करते हैं, वह इसके ऊपर अनावश्यक रूप से महंगी है। मैं इसके बजाय घने_रैंक () के साथ एक सरोगेट पंक्ति नाम उत्पन्न करता हूं।
db<>बेला यहाँ - एक आसान परीक्षण सेटअप और कम पंक्तियों के साथ।