यदि आप अपने लाइनस्ट्रिंग के प्रत्येक बिंदु की जांच करना चाहते हैं तो आप ST_DumpPoints
. कर सकते हैं उन्हें और M
. प्राप्त करें आयाम के साथ ST_M
. उसके बाद उपसमुच्चय को एक लाइनस्ट्रिंग के रूप में निकालें जिसमें अतिव्यापी M
. है मान और लागू करें ST_MakeLine
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;
डेमो:db<>fiddle
नोट :आपकी तालिका और लाइनस्ट्रिंग आकारों के आधार पर यह क्वेरी बहुत धीमी हो सकती है, क्योंकि मान क्वेरी समय में पार्स किए जा रहे हैं और इसलिए अनुक्रमित नहीं हैं। इम्हो एक अधिक सुंदर विकल्प होगा ..
.. 1) एक tstzrange
create बनाने के लिए कॉलम
ALTER TABLE t ADD COLUMN line_interval tstzrange;
.. 2) इसे ठीक से अनुक्रमित करने के लिए
CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);
.. और 3) इसे geom
. के समय के साथ पॉप्युलेट करने के लिए का पहला और अंतिम अंक:
UPDATE t SET line_interval =
tstzrange(
to_timestamp(ST_M(ST_PointN(geom,1))),
to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));
उसके बाद आप किसी दिए गए अंतराल के साथ अनुक्रमित कॉलम ओवरलैप को गीला करके जांच कर चीजों को गति दे सकते हैं। इससे क्वेरी समय में काफ़ी सुधार होगा:
SELECT * FROM t
WHERE line_interval && tstzrange(
to_timestamp(1618138148),
to_timestamp(1618388700));
डेमो:db<>fiddle
आगे पढ़ना: