PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Lưu trữ và truy vấn cây khoảng thời gian trong PostgreSQL

Bạn có thể sử dụng các loại dữ liệu phạm vi và lưu trữ từng loại rời rạc trong một hàng.

Đối với mẫu của bạn:

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

Để kiểm tra xem B có phải là một tập hợp con của A hay không, bạn có thể kết hợp cả hai với tất cả các bộ giá trị mà phạm vi của A chứa phạm vi của B:

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

Với điều đó, bạn có thể kiểm tra xem tất cả các giá trị từ tập hợp B có nằm trong kết quả trên hay không (có nghĩa là tất cả các phạm vi của B đều được chứa bởi ít nhất một phạm vi của 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'
     ));

Để có được giao lộ, bạn có thể kết hợp chéo cả hai và loại trừ các giao lộ trống:

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

Một vấn đề về cách tiếp cận này, đó là bạn chỉ được giữ các rangeS rời rạc thông qua các bộ giá trị khác nhau. Ví dụ:phạm vi [1,5] và [4,7] từ một tập hợp phải nằm trong một bộ chỉ có [1,7]. Để đảm bảo điều đó, bạn có thể chèn chúng vào một bảng tạm thời (trong khi chèn hoặc cập nhật), chúng tự tham gia chéo vào bảng với các bộ chồng lên nhau và chúng nối các bộ đó và giữ nguyên các bảng khác.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặt lại bộ đếm gia tăng tự động trong postgres

  2. Tương đương với univot () trong PostgreSQL

  3. Tại sao sử dụng cùng một trường khi lọc lại gây ra thời gian thực thi khác nhau? (sử dụng chỉ mục khác nhau)

  4. Đếm số lượng bản cập nhật

  5. Tôi không biết cách Postgresql tạo người dùng trên máy mac của tôi