sql >> データベース >  >> RDS >> PostgreSQL

PostGIS:zとmの次元をクエリする(linestringzm)

    LineStringのすべてのポイントをチェックしたい場合は、ST_DumpPoints それらを取得し、Mを取得します ST_Mのディメンション 。その後、重複するMを含むLineStringとしてサブセットを抽出します。 値を適用し、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

    :テーブルとLineStringのサイズによっては、値がクエリ時間に解析され、インデックスが作成されないため、このクエリはかなり遅くなる可能性があります。私見よりエレガントな代替案は..

    .. 1)tstzrangeを作成する 列

    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

    さらに読む:




    1. GROUP BYを使用して、列を結合/連結します

    2. RDSのデフォルトのタイムゾーン設定に合わせて調整する

    3. CakePHP 3-LocalStringFormatで日付を解析して、SQL形式を修正し、検証を修正します

    4. mysqlクエリ結果を目的の形式にフォーマットします