Nếu bạn muốn kiểm tra mọi điểm trong Chuỗi dòng của mình, bạn có thể ST_DumpPoints
họ và lấy M
thứ nguyên với ST_M
. Sau đó giải nén tập hợp con dưới dạng Chuỗi dòng chứa M
chồng chéo và áp dụng ST_MakeLine
với GROUP BY
:
WITH j AS (
SELECT id,geom,(ST_DumpPoints(geom)).geom AS p
FROM t
)
SELECT id,ST_AsText(ST_MakeLine(p))
FROM j
WHERE ST_M(p) BETWEEN 1618388000 AND 1618388700
GROUP BY id;
Demo: db <> fiddle
Lưu ý :Tùy thuộc vào kích thước bảng và Chuỗi dòng của bạn, truy vấn này có thể trở nên khá chậm, vì các giá trị đang được phân tích cú pháp trong thời gian truy vấn và do đó không được lập chỉ mục. Imho một sự thay thế thanh lịch hơn sẽ là ..
.. 1) để tạo tstzrange
cột
ALTER TABLE t ADD COLUMN line_interval tstzrange;
.. 2) để lập chỉ mục nó một cách chính xác
CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);
.. và 3) để điền nó với thời gian của geom
của đầu tiên và cuối cùng điểm:
UPDATE t SET line_interval =
tstzrange(
to_timestamp(ST_M(ST_PointN(geom,1))),
to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));
Sau đó, bạn có thể tăng tốc mọi thứ bằng cách kiểm tra kỹ hơn cột được lập chỉ mục trùng lặp với một khoảng thời gian nhất định. Điều này sẽ cải thiện đáng kể thời gian truy vấn:
SELECT * FROM t
WHERE line_interval && tstzrange(
to_timestamp(1618138148),
to_timestamp(1618388700));
Demo: db <> fiddle
Đọc thêm: