PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL में इंटरवल ट्री को स्टोर करना और क्वेरी करना

आप श्रेणी डेटा प्रकारों का उपयोग कर सकते हैं और प्रत्येक असंबद्ध प्रकार को एक पंक्ति में संग्रहीत कर सकते हैं।

आपके नमूने के लिए:

-- The table
CREATE TABLE sets(id text, range int4range);
-- Values of set A
INSERT INTO sets VALUES('A', '[1,1]'),('A','[7,7]'),('A','[9,13]');
-- Values of set B
INSERT INTO sets VALUES('B','[1,1]'),('B','[7,7]'),('B','[10,10]');

यह जाँचने के लिए कि क्या B, A का एक उपसमुच्चय है, आप दोनों को उन सभी टुपल्स के साथ जोड़ सकते हैं जिनमें A की श्रेणी में B की श्रेणी शामिल है:

 SELECT b.range
 FROM sets b JOIN sets a
     ON a.range @> b.range
 WHERE a.id='A' AND b.id='B'

इसके साथ, आप जांच सकते हैं कि सेट बी के सभी मान उपरोक्त परिणाम में हैं (जिसका अर्थ यह होगा कि बी की सभी श्रेणियां कम से कम एक श्रेणी में समाहित हैं):

 SELECT NOT EXISTS(
     SELECT 1 FROM sets q WHERE q.id='B' AND q.range NOT IN (
         SELECT b.range
         FROM sets b JOIN sets a
             ON a.range @> b.range
         WHERE a.id='A' AND b.id='B'
     ));

चौराहा पाने के लिए, आप दोनों को पार कर सकते हैं और खाली लोगों को बाहर कर सकते हैं:

 SELECT * FROM (
     SELECT a.range * b.range AS intersec
     FROM sets a CROSS JOIN sets b WHERE  a.id='A' AND b.id='B'
 ) i WHERE NOT isempty(i.intersec);

इस दृष्टिकोण के बारे में एक समस्या यह है कि आपको अलग-अलग टुपल्स के माध्यम से केवल असंबद्ध श्रेणी S रखना चाहिए। उदाहरण के लिए, एक सेट से रेंज [1,5] और [4,7] केवल [1,7] के साथ एक टपल में रहना चाहिए। यह सुनिश्चित करने के लिए, आप उन्हें एक अस्थायी तालिका में सम्मिलित कर सकते हैं (सम्मिलित या अद्यतन करते समय), वे तालिका में स्वयं को ओवरलैप करने वाले टुपल्स के साथ क्रॉस में शामिल हो जाते हैं और वे उनसे जुड़ जाते हैं और दूसरों को वैसे ही रखते हैं जैसे वे हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SqlAlchemy में अप्सर्ट करने के लिए पांडा का उपयोग कैसे करें

  2. पोस्टग्रेज pl/pgsql त्रुटि:कॉलम column_name मौजूद नहीं है

  3. मैं एक विशिष्ट मॉडल के निर्माण के लिए कैसे सुन सकता हूं और इसके आधार पर एक नया (एक अलग टेबल पर) बना सकता हूं?

  4. Postgresql:2 स्तंभों के संघ पर अद्वितीय बाधा

  5. पिवोटिंग फ़ंक्शन को लागू किए बिना विभिन्न क्षेत्रों के लिए कॉलम कैसे बनाएं