मेरे पास एक सारणी है जिसमें दो अलग-अलग प्रकार की पंक्तियां डाली जाती हैं:

  • कुछ पंक्तियाँ एक डेटापॉइंट का प्रतिनिधित्व करती हैं, एक विशिष्ट समय में एक कुंजी-मूल्य जोड़ी
  • अन्य पंक्तियाँ एक नई स्थिति का प्रतिनिधित्व करती हैं, जो भविष्य में अगली स्थिति तक बनी रहती हैं

वास्तविक समस्या में, मेरे पास टाइमस्टैम्प कॉलम है जो घटनाओं के क्रम को संग्रहीत करता है। SQL Fiddle उदाहरण में मैं एक सीरियल पूर्णांक फ़ील्ड का उपयोग कर रहा हूं, लेकिन यह वही विचार है।

यहाँ उदाहरण है:

http://www.sqlfiddle.com/#!17/a0823/6

मैं पहले प्रकार की प्रत्येक पंक्ति को उसकी स्थिति (जो वर्तमान पंक्ति से पहले नवीनतम स्थिति पंक्ति द्वारा दिया गया है) के साथ पुनर्प्राप्त करने के लिए एक प्रभावी तरीका ढूंढ रहा हूं।

Sqlfiddle लिंक पर क्वेरी एक उदाहरण है, लेकिन दो उपश्रेणियों का उपयोग करती है जो बहुत अक्षम है।

मैं टेबल की संरचना नहीं बदल सकता और न ही अन्य टेबल बना सकता हूं, लेकिन मैं टेबल पर कोई भी आवश्यक इंडेक्स बना सकता हूं।

मैं PostgreSQL 11.4 का उपयोग कर रहा हूं

0
José D. 11 अक्टूबर 2020, 18:18

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 है।

1
Gordon Linoff 11 अक्टूबर 2020, 18:23