【问题标题】:SELECT to contain values from first and last rows for each IDSELECT 以包含每个 ID 的第一行和最后一行的值
【发布时间】:2014-02-16 20:48:38
【问题描述】:

我正在尝试提出一个数据库查询,但我真的很努力,不仅要让它工作,还要找到一个我可以基于它的类似查询。我对 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

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

【问题讨论】:

    标签: android sqlite


    【解决方案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 与您感兴趣的行匹配的行,按 dateTime 降序或升序对它们进行排序,然后返回第一个。

    【讨论】:

    • 我最理想的做法是在一次查询中获取所有记录的数据,而不是多次返回数据库。我快到了 - 当有多个 routeId 时,如果没有连接排除所有记录,我无法计算出第一行和最后一行的值。我无法计算出子查询,因为我无法获得与 routeId 的关系。
    【解决方案2】:

    我设法提出了一个有效的查询,根据我有限的测试记录运行,它确实返回了我所追求的内容,尽管在我将它放入我的应用程序之前,我不能 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 路线走错了。

    【讨论】:

      猜你喜欢
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 2012-02-16
      • 1970-01-01
      • 2017-05-10
      • 2016-12-12
      相关资源
      最近更新 更多