Как вычитать из таблиц и объединять только строки с наименьшей разницей, используя SQL?

0

SQL IN PROGRESS

    SELECT race_id, runner_id, end_time , end_lat, end_lng, (prev_lat-end_lng/prev_lng-runner_lng) as slope,
CASE WHEN slope > 0 THEN direction = 'POSITIVE'
WHEN slope < 0 THEN direction = 'NEGATIVE'
ELSE '0'
    FROM race_info_table ri
    LEFT JOIN 
    (SELECT TOP 1 runner_id, runner_lat AS prev_lat, runner_lng AS prev_lng, occurred_at_10s, 
    datediff(second, occurred_at_10s,ri.end_time) as last_location 
    FROM runner_location_table rl
    ORDER BY datediff(second, occurred_at_10s,ri.end_time) ASC)
    ON ri.runner_id == rl.runner_id

ПРОБЛЕМА С ВЫШЕУКАЗЫВАЕМОЙ QUERY - я специально не знаю, как присоединиться к данным информации о гонке с ближайшим временным временем. Вышеприведенный запрос не работает из-за несоответствия даты, потому что он не знает, что такое ri.end_time.

Вопрос: Как я могу определить, работает ли бегун в положительном или отрицательном направлении наклона?

Как ответить на этот вопрос:

  1. Вычислите разницу между временами в таблице местоположения бегуна и таблицей race_info для каждого бегуна.
  2. Найдите кратчайшую разницу во времени в end_time и в методе timedamp произошедшей_а_10_.
  3. Присоединитесь к последним 10-секундным предыдущим данным местоположения бегуна из runner_location_table в таблицу race_info_table, используя runner_id.
  4. Теперь новая таблица должна иметь следующие столбцы: start_lng, start_lat, end_lng, end_lat, race_id, runner_id, end_time, start_time, runner_lat_100_prev, runner_lng_100_prev.
    1. Используя runner_lat_100_prev, runner_lng_100_prev, end_lng и end_lat, вычислите наклон.
    2. Добавьте новый столбец с помощью операторов case, где, если наклон положительный, у нас есть новый столбец, называемый направлением, указывающим положительный или отрицательный, если наклон отрицательный.

ВХОДНЫЕ ДАННЫЕ

race_info_table
 - start_lng DOUBLE
 - start_lat DOUBLE
 - end_lng DOUBLE
 - end lat DOUBLE
 - race_id BIGINT
 - runner_id BIGINT
 - end_time TIMESTAMP
 - start_time TIMESTAMP

runner_location_table (recorded every 100 seconds)
 - runner_id BIGINT​, Unique identifier for a runner
 - runner_lat DOUBLE​, Latitude of runner location
 - runner_lng DOUBLE​, Longitude of runner location
 - occurred_at_10s TIMESTAMP​, UTC timestamp that increases in 100 second increments.

КОД ДЛЯ СОЗДАНИЯ ТАБЛИЦ

CREATE TABLE runner_locations_table (runner_id BIGINT,
runner_lat DOUBLE, 
runner_lng DOUBLE, 
occurred_at_10s TIMESTAMP);

CREATE TABLE race_info_table (runner_id BIGINT,
race_id BIGINT,
start_lat DOUBLE,
start_lng DOUBLE,
start_time TIMESTAMP,
end_lat DOUBLE,
end_lng DOUBLE,
end_time TIMESTAMP);
  • 0
    Примерные данные, желаемые результаты и тег базы данных действительно помогут.
  • 2
    SQL Server не является MySQL - пометьте правильный движок, который вы используете. Исходя из использования типа данных timestamp, вы не используете sql server, поскольку этот тип данных не имеет отношения к дате или времени.
Показать ещё 2 комментария
Теги:

1 ответ

0

ЭТОТ ВОПРОС БЫЛ ОРИГИНАЛЬНО ПОДКЛЮЧЕН "sql-server". ЭТО ОТВЕТ ТОЛЬКО ДЛЯ СЕРВЕРА SQL.

Я думаю, вы просто хотите, чтобы outer apply:

SELECT race_id, runner_id, end_time, end_lat, end_lng 
FROM race_info_table ri OUTER APPY
     (SELECT TOP 1 driver_id, driver_lat AS prev_lat, driver_lng AS prev_lng, occurred_at_10s, 
datediff(second, occurred_at_10s,ri.end_time) as last_location 
      FROM runner_location_table rl
      WHERE ri.runner_id = rl.runner_id
      ORDER BY datediff(second, occurred_at_10s, ri.end_time) ASC
     ) rl;
  • 0
    Не могли бы вы объяснить, почему вы предлагаете OUTER APPLY и как это работает в этом случае?
  • 0
    @ pr338. , , Потому что это похоже на LEFT JOIN в коррелированном подзапросе. Похоже, это то, что вы пытаетесь сделать.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню