SQL加入以获取最新记录

时间:2011-11-17 06:38:49

标签: sql join sql-server-2008-r2

我有三张桌子:

  • 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 个答案:

答案 0 :(得分:1)

您可以使用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 

答案 1 :(得分:1)

尝试这样的事情(未经测试)

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

修改

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