计算人的步行速度

时间:2015-02-04 18:10:15

标签: sql sql-server

我正在使用sql-server来计算人的步行速度。我有一张表:

Name   time(in min)  latitude longitude
Billy   1             x1       y1
Billy   2             x2       y2
...
Jim     1             k1       m1
Jim     2             k2       m2
...
Kate    1             l1       n1
Kate    2             l2       n2

我想选择一些小时的平均速度在5-7米/小时之间的人。这是我使用Haversin'law计算从A点到B点的距离的代码。

SELECT Name,
    3956 * 2 * ASIN(SQRT( POWER(SIN((orig_lat1 - abs(dest_lat2)) * pi()/180 / 2), 2)+ COS(orig_longitude * pi()/180 ) * COS(abs(dest_lat2) * pi()/180) * POWER(SIN((orig_longitude - dest_longitude) * pi()/180 / 2), 2) )) 
          AS distance
From Table1
Where distance>5 and distance<7

orig_lat1,dest_lat2等是原始点和目的地的纬度和经度。但是,我不知道如何动态跟踪速度,表每分钟更新一次。

感谢。

我的想法是开始以某种方式宣布纬度和经度(原始和目的地)。说:

DECLARE @orig_lat1 blabla
DECLARE @orig_long blabla

目标是至少在一小时内检查平均速度。因此,如果在任何时间人们的速度是5-7英里/小时。然后打印人名。

2 个答案:

答案 0 :(得分:0)

假设我理解你真正需要做的是将表1连接到自己,寻找已经走过符合你标准的距离的人。

我打算假设你正在寻找以这种速度旅行一段时间的人。我决定把它变成一个变量,这样你就可以玩你想要抽样的时间。

 declare @duration int

set @duration = 1

   SELECT a.Name
          ,a.lat
          ,a.long
          ,b.lat
          ,b.long
          ,3956 * 2 * ASIN(SQRT( POWER(SIN((a.lat - abs(b.lat)) * pi()/180 / 2), 2)
             + COS(a.long * pi()/180 ) * COS(abs(b.long) * pi()/180) 
             * POWER(SIN((a.long - b.long) * pi()/180 / 2), 2) )) 
          AS distance
From Table1  a
inner join Table1 b
  on a.personID = b.personID
  and a.time = b.time +  @duration
Where 3956 * 2 * ASIN(SQRT( POWER(SIN((a.lat - abs(b.lat)) 
      * pi()/180 / 2), 2)+ COS(a.long * pi()/180 ) * COS(abs(b.long) 
      * pi()/180) * POWER(SIN((a.long - b.long) * pi()/180 / 2), 2) )) 
       between 5 and 7

答案 1 :(得分:0)

您需要等到第61分钟的参赛作品被添加。然后使用:

SELECT NAME FROM
(SELECT Name,
  3956 * 2 * ASIN(SQRT( POWER(SIN((orig_lat1 - abs(dest_lat2)) * pi()/180 / 2),   2)+ COS(orig_longitude * pi()/180 ) * COS(abs(dest_lat2) * pi()/180) * POWER(SIN((orig_longitude - dest_longitude) * pi()/180 / 2), 2) )) 
AS distance
From Table1 Where time=1) F
LEFT OUTER JOIN
(SELECT Name,
  3956 * 2 * ASIN(SQRT( POWER(SIN((orig_lat1 - abs(dest_lat2)) * pi()/180 / 2), 2)+ COS(orig_longitude * pi()/180 ) * COS(abs(dest_lat2) * pi()/180) * POWER(SIN((orig_longitude - dest_longitude) * pi()/180 / 2), 2) )) 
AS distance
From Table1 where time=61) S
ON F.Name=S.Name 
WHERE (F.Distance + S.Distance) BETWEEN 5 AND 7

这假设名称都是唯一的,并且表格中的时间以分钟为单位记录,但您希望最终单位为小时。