我正在使用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定律计算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英里/小时。然后打印人民的名字。
发布于 2015-02-04 18:45:05
假设我理解这个问题,你真正需要做的是把表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发布于 2015-02-04 18:52:21
您需要等到第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这假设名称都是唯一的,表中的时间以分钟为单位记录,但您希望最后的单位是小时。
https://stackoverflow.com/questions/28328384
复制相似问题