2015-02-04 2 views
0

Я использую sql-сервер для расчета скорости ходьбы человека. У меня есть стол, такой как:Рассчитайте скорость ходьбы для людей

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 м/час. Вот мой код, чтобы рассчитать расстояние от точки A до точки B, используя Haversin'law.

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 миль/час. Затем напечатайте имя народа.

+0

Извините, на этом вам вопрос? Формула для расчета скорости? «Как вы отслеживаете скорость?» Зачем отслеживать скорость, когда вы можете ее вычислить? Скорость будет постоянно изменяться, лучше всего это средняя скорость, которая равна расстоянию/времени = скорость. Например, 5-7 миль в час. Итак, наш (расстояние/время) = скорость в единицах расстояния/минуты ... Или вы спрашиваете, как сделать самостоятельное соединение, чтобы получить следующий «интервал» и расстояние? – xQbert

+0

Спасибо за ответ. Уравнение здесь просто для вычисления расстояния. Чтобы рассчитать скорость в миле/час, мне нужно собрать 1-й-60-й, 2-й-61-й строки для широты и долготы, чтобы вычислить скорость. (поскольку таблица обновляется каждую минуту). Как достичь этой цели, пожалуйста? Это средняя скорость, которую я ищу. – user4441082

+0

Визуальный пример ожидаемых результатов поможет здесь. Вы хотите, чтобы скорость avg превысила все записи для имени, скорость между каждой записью? слишком много неизвестных. Итак, если человек выезжает на 2 часа, мы показываем среднюю скорость в течение всего 2 часов или на каждом нашем или между каждым интервалом? говорят, что они выходят на 1 прогулку сейчас, и еще одна прогулка позже ... Как мы можем различать отдельные прогулки, поэтому мы не смешиваем измерения lat/long ... Начните с конца в уме (наглядный пример поможет в этом) – xQbert

ответ

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 
+0

Разве это не означает, что люди никогда не меняют направление на @duration? Разумеется, самое лучшее, что можно сделать с данными, - это то, что никто не меняет направление в течение одной минуты, делая это предположение в течение всего часа не лучшим. – DWal

+0

Спасибо phipywr, этот метод длительности - это то, что мне нужно, но Dwal упоминает исключение, о котором я никогда не думал. Да, что, если люди идут туда и обратно, это очень сложно. – user4441082

+0

Если они идут туда и обратно, они действительно не путешествуют 5-7 миль в час на основании критериев, указанных выше. Они путешествуют на неопределенные расстояния, но, учитывая то, как собираются данные, вы действительно можете сравнить расстояние. Именно по этой причине я набрал его, чтобы просто посмотреть на него с минуты на минуту, потому что, если человек остановится и поговорит немного. – phipywr

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 

Это предполагает, что имена являются уникальными и что разы в таблице записаны в течение нескольких минут, но вы хотите, чтобы конечные узлы быть часами.

+0

Большое спасибо за ваш ответ. Ваш метод легко понять. Но если время идет вперед, как проверить скорость с 2-й минуты до 62 минут? И еще раз окно? Должен ли я определить некоторую переменную, чтобы увеличить время, пожалуйста? – user4441082

+0

Снимите время Where = x. В окне «Выбрать, включить, время». Затем в предложении ON соединения, установите AND F.Time + 60 = S.Time – Rhys

Смежные вопросы