SQL Сервер: вернуть координаты на ближайшее время дня - PullRequest
0 голосов
/ 25 февраля 2020

Есть три таблицы, из которых мне нужна информация: Machine, MachineActivity и LocationHistory. Таблица Machine содержит информацию о машине, такую ​​как MachineNumber. MachineActivity предоставляет информацию об активности за определенный день, и, наконец, LocationHistory просто сохраняет время нахождения машины в течение дня.

Я написал представление, которое получает информацию о машине за определенный день и возвращает историю их местоположения. до 6 утра. Проблема в том, что некоторые машины имеют местоположения после 6 утра, в этом случае я все еще хочу вернуть данные о местоположении, поэтому мне нужно вернуть координаты местоположения в течение ближайшего времени, доступного к 6 часам утра, но не обязательно меньше 6 часов утра.

SELECT DISTINCT
    MA.ActivityDate,
    M.MachineNumber,
    LH.Latitude,
    LH.Longitude
FROM 
    Machine M WITH(NOLOCK)
JOIN 
    MachineActivity MA WITH(NOLOCK) ON MA.MachineId = M.Id 
JOIN 
    LocationHistory LH WITH(NOLOCK) ON LH.MachineActivityId = MA.Id
WHERE
    (CAST(LH.LocationTime AS Time) < '06:00:00')

Вот где я сейчас с ним. Я знаю, что, вероятно, понадобится подзапрос, и в основном это вопрос . Однако я не могу преобразовать этот вопрос в свой сценарий, тот факт, что он написан на PostgreSQL, не помогает, когда это SQL Сервер.

1 Ответ

1 голос
/ 25 февраля 2020

Боковое соединение (apply на SQL сервере) представляется целесообразным. Из того, что вы описываете:

SELECT MA.ActivityDate, M.MachineNumber, LH.Latitude, LH.Longitude
FROM Machine M JOIN
     MachineActivity MA 
     ON MA.MachineId = M.Id CROSS APPLY
     (SELECT TOP (1)
      FROM LocationHistory LH 
      WHERE LH.MachineActivityId = MA.Id
      ORDER BY ABS(DATEDIFF(SECOND, CONVERT(TIME, LH.LocationTime), CONVERT(TIME, '06:00:00') ))
     ) LH;

Примечание. Не следует использовать WITH (NOLOCK), если вы не полностью понимаете, что он делает, включая тот факт, что он может возвращать грязные, противоречивые данные.

...