【问题标题】:SQL Join to get most recent recordSQL Join 获取最新记录
【发布时间】:2011-11-17 06:38:49
【问题描述】:

我有三张桌子:

  • 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 条 EventValue 记录,在这种情况下您的期望是什么?要查看两条记录还是只查看其中一条?另外,临时表可以接受吗?

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


【解决方案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 这个查询(几乎)有效,谢谢 - 但是有没有办法包含测量表中第一个事件之前的条目
  • 您可以使用 OUTER APPLY 而不是 CROSS APPLY,您将获得“数据”(EventValues)列的 NULLS。
  • 我接受了这个答案而不是 amit-g,因为这在我的情况下表现更好,尽管两者都产生了正确的结果。
  • 谢谢。我认为这两种解决方案都很好,很高兴了解这两种技术。性能差异可能是我将 ORDER BY 更改为“E.Time DESC”并且 amit_g 使用了您的表达方式。我的可以利用 E.Time 上的索引,因此在他的解决方案中更改它(在 OVER 子句中)可能会给您相同的性能。然后你就可以使用你认为更干净、更容易维护的那个了。
【解决方案2】:

试试这样的东西(未测试)

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

【讨论】:

  • +1 这个查询(几乎)有效,谢谢 - 但是有没有办法包含测量表中第一个事件之前的条目?
猜你喜欢
  • 2017-11-19
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2021-12-14
  • 2016-10-15
  • 2016-02-11
  • 1970-01-01
  • 2020-02-28
相关资源
最近更新 更多