带有连接的SQL查询,但只想要来自连接表的最新记录

时间:2017-08-06 19:03:17

标签: sql sql-server

我有一个数据库,其中包含一个用于引擎的表(EngineId,Make,Model,SerialNumber等)以及一个在引擎上有Test值的表(TestId,EngineId,Value1,Value2等)。

我想从Engines表中选择所有记录以及最新的测试值(可能有多个测试记录,但我只想要最新的)。这似乎很简单,但出于某种原因,我无法获得SQL语法。

我可以开始使用类似下面的内容,但后来我被卡住了。

SELECT e.*, t.Value1, t.Value2
FROM Engine e
left join Event ev on e.EngineID = ev.EngineID
left join Test t on ev.EventID = t.EventID
WHERE ev.EventType = 'TEST'

我可以接近以下内容,但它只返回包含测试数据的记录。我想在没有测试数据的情况下返回引擎记录:

SELECT e.*, t.Nox, t.CO
FROM Engine e
left join Event ev on e.EngineID = ev.EngineID
left join Test t on ev.EventID = t.EventID
left join EventType et on ev.EventTypeId = et.EventTypeID
WHERE Upper(et.Name) = 'TEST'
  AND ev.EventDate= ( SELECT MAX(EventDate) 
                        FROM Event ev2
                        left join EventType et2 on ev2.EventTypeID = et2.EventTypeID
                        WHERE ev2.EngineID = e.EngineID AND 
                        Upper(et2.Name) = 'TEST')

我可以接近以下内容,但我仍然需要以某种方式加入Test表:

SELECT DISTINCT e.*, om.maxdate
FROM Engine e
LEFT JOIN (
  select ev2.EngineID, max(EventDate) as maxdate
  from Event ev2
  LEFT JOIN EventType et on ev2.EventTypeID = et.EventTypeID
  WHERE Upper(et.Name) = 'TEST'
  group by EngineID
) om on e.EngineID = om.EngineID
--LEFT JOIN Test t on om.EventID = t.EventID

如果有帮助,我可以执行存储过程。

你问了一些样本数据,所以这里有。我想返回所有引擎记录以及最新的测试值。

引擎

EngineId    Make    Model   SerialNumber
    1   Waukesha    5794    C-62124
    2   Waukesha    5800    F-199374
    3   NULL        NULL    B-200305
    4   Waukesha    6000    D-999777
    5   Waukesha    6100    E-877324
    6   Briggs & Stratton   LW300   SL-122375
    7   Briggs & Stratton   LW350   SL-375200
    8   Briggs & Stratton   GS250   LS-988755
    9   Briggs & Stratton   5794    SN12345

测试

TestID  EventID EngineID    TestDate    Description Value1  Value2
1   7   1   03/01/17 12:00 AM   Testing 30  50
9   8   1   01/01/17 12:00 AM   Testing 20  20
17  11  1   12/01/16 12:00 AM   Testing 16  15

5 个答案:

答案 0 :(得分:1)

你可以使用

  SELECT TOP 1 e. *,t.Value1,t.Value2 

要获得最高记录并确保顶部是最新记录,请使用

订购表格
  ORDER BY column1, column2, ... ASC|DESC

希望这会有所帮助......

答案 1 :(得分:0)

如果您指的是给定引擎的最新TEST事件(基于EventDate),那么它是:

SELECT e.*, t.Value1, t.Value2
  FROM Engine e
    LEFT JOIN Event ev
      ON e.EngineID = ev.EngineID
          AND ev.EventType = 'TEST'
          AND ev.EventDate = (SELECT MAX(ev2.EventDate)
                              FROM Event ev2
                              WHERE ev2.EngineID = e.EngineID
                                  AND ev2.EventType = 'TEST')
    LEFT JOIN Test t
      ON ev.EventID = t.EventID

请注意,如果最新活动有更多测试记录,则会返回所有测试记录,因为所有测试记录都共享相同的最新EventDate。但这似乎是正确的,因为你没有区分分配给同一事件的多个测试记录,所以它们是相同的。

答案 2 :(得分:0)

当您说您想要最新的测试值时,这意味着您可以通过某种方式识别最新的测试值。这可以通过检索最新的eventdate来完成。

您必须在查询中使用子查询。

SELECT e.*, t.Value1, t.Value2
FROM Engine e
left join Event ev on e.EngineID = ev.EngineID
left join Test t on ev.EventID = t.EventID
WHERE ev.EventType = 'TEST'
  AND ev.EventDate= ( SELECT MAX(EventDate) 
                        FROM Event
                        WHERE Event.EventID = t.EventId
                          AND Event.EngineID = ev.EngineId )

这应该为您提供引擎上事件的最新测试结果

答案 3 :(得分:0)

您可以使用;with Tcte as ( SELECT e.* , t.Value1 , t.Value2 , rank() over (partition by e.EngineID order by t.TestDate desc) r FROM Engine e left join Event ev on e.EngineID = ev.EngineID left join Test t on ev.EventID = t.EventID WHERE ev.EventType = 'TEST') SELECT * FROM Tcte WHERE r=1 函数仅获取每个引擎的最后一次测试。

gcloud --project=$PROJECT compute instances create $VM --zone=$ZONE --machine-type=$MACHINE --scopes=cloud-platform 

答案 4 :(得分:0)

试试这个

 ;with testValues as
 ( select ev.EngineID, ev.EventId ,t.TestId,t.Value1, t.Value2 
   ,row_number()  over(partition by ev.EventId order by ev.EventDate desc)rowNumber
   from Event ev
   left join Test t on ev.EventID = t.EventID
   WHERE ev.EventType = 'TEST'
 )

SELECT e.*, v.Value1, v.Value2
FROM Engine e
left join testValues v on e.EngineID = v.EngineID and v.rowNumber=1

或者这个

;with testData as
(
 SELECT e.*, t.Value1, t.Value2
 ,row_number()  over(partition by ev.EventId order by ev.EventDate desc)rowNumber
 FROM Engine e
 left join Event ev on e.EngineID = ev.EngineID and ev.EventType = 'TEST'
 left join Test t on ev.EventID = t.EventID
) 
select * from testData where rowNumber=1