मेरे पास एक सारणी है जिसमें दो अलग-अलग प्रकार की पंक्तियां डाली जाती हैं:
- कुछ पंक्तियाँ एक डेटापॉइंट का प्रतिनिधित्व करती हैं, एक विशिष्ट समय में एक कुंजी-मूल्य जोड़ी
- अन्य पंक्तियाँ एक नई स्थिति का प्रतिनिधित्व करती हैं, जो भविष्य में अगली स्थिति तक बनी रहती हैं
वास्तविक समस्या में, मेरे पास टाइमस्टैम्प कॉलम है जो घटनाओं के क्रम को संग्रहीत करता है। SQL Fiddle उदाहरण में मैं एक सीरियल पूर्णांक फ़ील्ड का उपयोग कर रहा हूं, लेकिन यह वही विचार है।
यहाँ उदाहरण है:
http://www.sqlfiddle.com/#!17/a0823/6
मैं पहले प्रकार की प्रत्येक पंक्ति को उसकी स्थिति (जो वर्तमान पंक्ति से पहले नवीनतम स्थिति पंक्ति द्वारा दिया गया है) के साथ पुनर्प्राप्त करने के लिए एक प्रभावी तरीका ढूंढ रहा हूं।
Sqlfiddle लिंक पर क्वेरी एक उदाहरण है, लेकिन दो उपश्रेणियों का उपयोग करती है जो बहुत अक्षम है।
मैं टेबल की संरचना नहीं बदल सकता और न ही अन्य टेबल बना सकता हूं, लेकिन मैं टेबल पर कोई भी आवश्यक इंडेक्स बना सकता हूं।
मैं PostgreSQL 11.4 का उपयोग कर रहा हूं
1 उत्तर
विंडो फ़ंक्शंस का उपयोग करने के लिए शायद सबसे कुशल तरीका है:
select p.*
from (select p.*,
max(attrvalue) filter (where attrname = 'status_t1') over (partition by grp_1 order by id) as status_t1,
max(attrvalue) filter (where attrname = 'status_t2') over (partition by grp_2 order by id) as status_t2
from (select p.*,
count(*) filter (where attrname = 'status_t1') over (order by id) as grp_1,
count(*) filter (where attrname = 'status_t2') over (order by id) as grp_2
from people p
) p
) p
where attrname not in ('status_t1', 'status_t2');
यहां एक db<>fiddle है।
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।