2017-08-15 145 views
2

的问题!PostgreSQL的选择查询(GPS)

我对我现在的储蓄汽车的GPS数据的PostgreSQL数据库。现在,我在准备历史报告,我必须根据自己的速度,以显示两个不同的stutus到每一辆汽车,杉杉采空如果汽车速度保持0 5分钟以内,如果超过5分钟,然后我必须表明停车。我每10秒从GPS获取数据。有没有办法做到这一点?任何帮助表示赞赏。

这里是表结构:

CREATE TABLE gps_data_abl_soft 
(
    id bigint NOT NULL DEFAULT nextval('gps_data_id_seq'::regclass), 
    device_id bigint NOT NULL DEFAULT (-1), 
    keyword character varying(30), 
    coordinate geometry, 
    date_time timestamp without time zone NOT NULL DEFAULT now(), 
    message character varying(200) NOT NULL DEFAULT ''::character varying, 
    speed real NOT NULL DEFAULT 0.0, 
    angle real NOT NULL DEFAULT 0.0, 
    CONSTRAINT gps_data_pkey PRIMARY KEY (id) 
) 

Here is the sample data from my table:

+0

我在其中设置有一个与速度0没有汽车的样本数据。并且数据不会每10秒收到一次。对不起,这个:) – Mukhammadsher

+0

你在PHP想一个解决方案,或在PostgreSQL的? – ImClarky

+0

如果可能的话在PostgreSQL的@ImClarky – Mukhammadsher

回答

0

我已经通过创建PostgreSQL的功能解决了这个问题喽!此功能

SELECT ST_AsGeoJSON(ST_Transform(ST_Multi(ST_Union(coordinate)), 4326)) AS coordinate, 
difference from stop_func(device_id, start_time, end_time) group by difference; 

样品结果的

-- Function: stop_func(bigint) 

-- DROP FUNCTION stop_func(bigint); 

CREATE OR REPLACE FUNCTION stop_func(IN device_id_param bigint) 
    RETURNS TABLE(coordinate geometry, difference interval) AS 
$BODY$ 
DECLARE 
    r record; 
    stop_records stop_record[]; 
    speed_zero boolean; 
    prev_date_time timestamp; 
    coordinate geometry; 
BEGIN 

    speed_zero:=false; 

    for r in SELECT g.coordinate, g.date_time, g.speed FROM gps_data_abl_soft g WHERE g.device_id=device_id_param ORDER BY g.date_time 
    LOOP 
     IF r.speed=0 THEN 
      IF NOT speed_zero THEN prev_date_time:=r.date_time; coordinate=r.coordinate; END IF; 

      speed_zero:=true; 
     ELSE 
      IF speed_zero THEN 

       stop_records=array_append(stop_records,(coordinate, r.date_time-prev_date_time)::stop_record); 
      END IF; 

      speed_zero:=false; 

     END IF; 

    END LOOP; 
    RETURN QUERY SELECT * FROM unnest(stop_records); 



END 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100 
    ROWS 1000; 
ALTER FUNCTION stop_func(bigint) 
    OWNER TO dr; 

用法是在这里:

enter image description here