SQL Join, чтобы получить самую последнюю запись - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть три таблицы:

  • Measurements (MeasureID, Time, Distance, Value)
  • Events(EventID, Time Value)
  • EventValues (EventDataID, EventID, Type, Value)

Мне нужно получить для каждого измерения самое последнее событие (в прошлом) и связанные с ним данные о событиях.

Мой текущий запрос довольно уродлив:

SELECT 
    M.*,
    (SELECT TOP 1 EV.value FROM [Event] E JOIN EventValues EV ON E.EventID = EV.EventID 
     WHERE M.Time >= E.Time ORDER BY M.Time-E.Time) AS Data,
FROM [Measure] M 
ORDER BY M.Distance

и это позволяет мне выбрать только один столбец из таблицы EventValues (мне нужно больше)

Есть ли способ сделать это с помощью объединения?

РЕДАКТИРОВАТЬ : Мне также нужно выбрать ВСЕ записи из таблицы измерений, даже если они находятся до первого события (т. Е. Просто выбрать нулевые данные для объединения)

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

Попробуйте что-то вроде этого (не проверено)

SELECT * FROM
(
    SELECT M.*, E.*, EV.EventDataID, EV.Type, EV.Value,
        Rank() over (Partition BY M.MeasureID order by M.Time - E.Time) as Rank
    FROM [Measure] M 
    INNER JOIN [Event] E ON M.Time >= E.Time
    INNER JOIN EventValues EV ON E.EventID = EV.EventID
) T
WHERE Rank = 1

EDIT

SELECT * FROM
(
    SELECT M.*, E.*, EV.EventDataID, EV.Type, EV.Value,
        Rank() over (Partition BY M.MeasureID order by M.Time - E.Time) as Rank
    FROM [Measure] M 
    LEFT JOIN [Event] E ON M.Time >= E.Time
    LEFT JOIN EventValues EV ON E.EventID = EV.EventID
) T
WHERE Rank = 1
1 голос
/ 17 ноября 2011

Вы можете использовать CROSS APPLY.

SELECT  
    M.*, Data.* 
FROM [Measure] M 
CROSS APPLY
     (SELECT TOP 1 EV.* FROM [Event] E JOIN EventValues EV ON E.EventID = EV.EventID  
     WHERE M.Time >= E.Time ORDER BY E.Time DESC) AS Data
ORDER BY M.Distance 
...