我正在運行一個查詢,查找記錄,並在一段時間後查找另一條記錄。PostgreSQL時間戳 - 索引
表定義:
(
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
)
上有形狀和shape_utm有關日期時間,lokalitet,cowid,gpsstatus,要旨索引的索引。
的問題應該每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或5或6秒?或者也可能有小數秒? –
可以有更多的記錄不想在第一個和第二個記錄之間檢索?如果沒有,只需要檢索時間戳高於第一個記錄的較早的那個。 – Pablo
@Mark Byers:只有三種可能性,時間戳被截斷爲秒。 - 是的,我剛剛發現,使用鏈接的ors或in()的運行速度要快得多,儘管sql變得非常難看...... – MortenSickel