3

レコードを検索し、一定時間後に別のレコードを検索するクエリを実行しています。

テーブル定義:

(
  id integer primary key,
  gpsstatus character(2),
  datetime timestamp without time zone,
  lat numeric(9,6),
  lon numeric(9,6),
  alt numeric(9,4),
  time integer,
  datafileid integer,
  shape geometry,
  speed double precision,
  dist double precision,
  shape_utm geometry,
  lokalitet character(128),
  cowid integer
)

datetime、lokalitet、cowid、gpsstatus、gist-indexにはshapeとshape_utmのインデックスがあります。

ポイントは5秒ごとにサンプリングする必要があるので、やってみました

select <something more>,p1.timestamp 
from table p1, table p2 
where p1.timestamp + interval '5 secound' = p2.timestamp

それはかなり速く実行されましたが、サンプリングのジッターのためにかなりの数のポイントが失われたことがわかりました。そのため、ポイントは4〜6秒離れている可能性があります。

それから私は試しました:

where    (p2.timestamp, interval'0 second')
overlaps (p1.timestamp + interval '4 second', interval '2 second')

そしてそれは何年もかかりました。私はまた、より簡単な解決策を試しました:

WHERE p1.timestamp + interval '4 second' <= p2.timestamp
AND   p1.timestamp + interval '6 second' >= p2.timestamp

これもまた、使用できないほど遅くなってしまいました。

タイムスタンプフィールドには通常のインデックスがあります。このクエリを使用可能にする特別な種類のインデックスはありますか?

現時点でのクエリ:

SELECT
    p1.cowid,
    p1.datetime,
    st_distance(p1.shape_utm, lead(p1.shape_utm)
      OVER (ORDER BY p1.datetime)) AS meters_obs,
    st_distance(p1.shape_utm, lead(p1.shape_utm, 720)
      OVER (ORDER BY p1.datetime)) AS meters_hour,
    observation.observation
  FROM (gpspoint p1 LEFT JOIN observation
                           ON (observation.gpspointid = p1.id)),
       status
  WHERE p1.gpsstatus = status.id
    AND status.use = true;

また、特定の間隔を要求することで、許容可能なクエリ時間を取得できる場合があります。

4

1 に答える 1

6

前のレコードが必要な場合は、次のように実行できます。

SELECT  p, LAG(p) OVER (ORDER BY timestamp) AS pp
FROM    table p
ORDER BY
        timestamp

現在の秒より数秒前のレコードが必要な場合は、次を使用し4ます。6

SELECT  p1.*, p2.*
FROM    table p1
LEFT JOIN
        table p2
ON      p2.timestamp BETWEEN p1.timestamp - '4 seconds'::INTERVAL
                         AND p1.timestamp - '6 seconds'::INTERVAL
ORDER BY
        p1.timestamp

すべてが範囲内にある場合、これにより複数の以前のレコードが返される場合があります。

于 2012-05-15T20:13:16.323 に答える