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'

С това можете да проверите дали всички стойности от набор B са в горния резултат (което ще означава, че всички диапазони на B се съдържат от поне един диапазон на A):

 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);

Един проблем при този подход е, че трябва да запазите само несвързани диапазони през различни кортежи. Например диапазон [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. Django &Postgres - процентил (медиана) и групиране по

  2. Промяна на езика на датата на PostgreSQL от заявката

  3. Съкращения за търсене в пълен текст на PostgreSQL

  4. Подобряване на производителността на ORDER BY при кръстосано свързване на jsonb с вътрешно свързване на група от

  5. ПРИСЪЕДИНЕТЕ (ИЗБЕРЕТЕ ... ) ue ON 1=1?