SELECT包含每个ID的第一行和最后一行的值

时间:2014-02-16 20:48:38

标签: android sqlite

我正在尝试提出一个数据库查询,我真的很挣扎,不仅要让它工作,而且要找到一个类似的查询,我可以根据它。我在Android开发中对SQLite很陌生。

这就是我想要做的。我有一张桌子,我正在记录GPS位置。每行都有一个pointId,routeId,纬度,经度和日期时间。

我的结果集中的每一行都需要包含每个routeId的第一个和最后一个记录的日期时间,我现在已经获得了该记录,但我还需要包含第一个和最后一个记录的纬度和经度。

这是我到目前为止所处的位置,删除了多个版本的连接和子查询无法正常工作:http://www.sqlfiddle.com/#!7/47012/69(注意值不是真的)

我想要的是:

routeid  minDatetime           maxDatetime          firstLat  firstLong   lastLat   lastLong
54       2014-02-16 12:01:00   2014-02-16 12:06:00  0.0004    1.345       0.0007    1.349
55       2014-02-16 12:07:00   2014-02-16 12:07:00  0.0011    1.388       0.0011    1.388

我希望这是有道理的。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

您可以利用ORDER BYLIMIT

SELECT * FROM <yourtable> WHERE routeid = '54' ORDER BY dateTime DESC LIMIT 1

获得第一个;

SELECT * FROM <yourtable> WHERE routeid = '54' ORDER BY dateTime ASC LIMIT 1

得到最后一个。

逻辑。选择id与您感兴趣的id匹配的行,按dateTime按降序或升序排序,然后返回第一行。

答案 1 :(得分:1)

我设法提出了一个有效的查询,从我有限的测试记录中运行,确实返回了我所追求的内容,但直到我将其放入我的应用程序中我并不是100%确定它是正确的。

http://www.sqlfiddle.com/#!7/47012/147

我的查询,无疑可以改进:

select 
a.routeId, 
min(a.datetime),
max(a.datetime),
(select latitude from GPSPointLog b 
  WHERE b.routeId = a.routeId ORDER BY datetime LIMIT 1) 'firstLat',
(select longitude from GPSPointLog c 
  WHERE c.routeId = a.routeId ORDER BY datetime LIMIT 1) 'firstLong',
(select latitude from GPSPointLog d 
  WHERE d.routeId = a.routeId ORDER BY datetime DESC LIMIT 1) 'lastLat',
(select longitude from GPSPointLog e 
  WHERE e.routeId = a.routeId ORDER BY datetime DESC LIMIT 1) 'lastLong'
from GPSPointLog a 
GROUP BY a.routeId
order by a.routeId

我知道沿着JOIN路线走错了。