现在我在做一个关于分析公交站点的功能,就是利用乘客刷卡的时间与车上gps到站时间做对比,从而得出这个乘客是在哪个站点刷卡的。
刷卡记录表:card
id tdate line car_id station
1447647 2014-11-24 12:27:00 301 13913
1447648 2014-11-24 11:56:00 906 24470
gps到站明细表:gps_time
id tdate line car_id station
44566 2014-11-24 12:27:30 301 13913 清晖园
44567 2014-11-24 12:24:30 306 25513 客运总站
44568 2014-11-24 12:27:30 301 13913 乐购
44569 2014-11-24 12:28:47 924 34407 文化公园
44570 2014-11-24 12:30:08 301 13913 新世界
我的思路是以card表每条记录为单位,比如id=1447647这条刷卡记录,根据车牌号检索gps_time表中这台车最接近刷卡时间的记录,即可得出该上客的站点。
sql语句已经写好,可以查询到希望的结果,但是运行速度慢,需要2.5秒,请教各位大神应该如何优化
sql语句如下:
select station from (
select g.station from gps_time g,card c
where c.id=1447647 and substr(to_char(g.tdate,'yyyy-MM-dd hh:mm:ss'),0,10)='2014-11-24'
and g.car_id='粤X13913' and abs(c.tdate-g.tdate)<0.003 order by abs(c.tdate-g.tdate) )
where rownum=1;
------解决思路----------------------
SELECT STATION
FROM (SELECT G.STATION
FROM GPS_TIME G, CARD C
WHERE C.ID = 1447647
AND G.TDATE >= DATE '2014-11-24'
AND G.TDATE < DATE'2014-11-24' + 1
AND G.CAR_ID = '粤X13913'
AND (C.TDATE < G.TDATE + 0.003 AND C.TDATE > G.TDATE - 0.003)
ORDER BY ABS(C.TDATE - G.TDATE))
WHERE ROWNUM = 1;