2017-08-06 60 views
2

我有一個包含引擎(EngineId,Make,Model,SerialNumber等)的表的數據庫和引擎上具有Test值的表(TestId,EngineId,值1,值2等)。帶有連接的SQL查詢,但只想要連接表中的最新記錄

我想從引擎表中選擇所有記錄以及最新的測試值(可能有多個測試記錄,但我只想要最新的)。這看起來很簡單,但由於某種原因,我無法完全掌握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') 

我可以親近下面,但我仍然需要加入以某種方式測試表:

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 
+0

更新您的問題添加適當的數據樣本和預期的結果 – scaisEdge

+0

請與您的數據樣本和預期結果提供爲好。 –

回答

1

可以使用

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

讓高層記錄,以確保頂部是最新的,責令表

ORDER BY column1, column2, ... ASC|DESC 

希望這有助於....

0

如果你意味着對給定的發動機最新的測試活動(基於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。但是這似乎是正確的,因爲你沒有區分分配給同一事件的多個測試記錄,所以它們是平等的。

+0

我需要返回沒有測試數據的引擎記錄。 – codecypher

+0

@codecypher - 當然,從'Engine'到'Event'的'LEFT JOIN'確保了這一點。 – miroxlav

+0

我認爲發生的事情是WHERE子句縮小範圍,並且不返回沒有測試事件的引擎記錄。 – codecypher

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) 

這應該給你最新的測試結果爲事件在發動機

0

可以使用rank()功能只得到每個引擎的最後一次測試。

;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 
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 
+0

感謝您的建議。我只想返回一個測試記錄,即使他們沒有測試記錄,我也想返回所有引擎記錄。它顯示你的代碼返回所有的測試記錄,並且只返回包含測試數據的引擎記錄 – codecypher

+0

嘗試第一個查詢,即使它們沒有測試記錄,它也會返回所有引擎記錄 –

+0

另外,我還使用連接本身的過濾條件編輯了第二個查詢(左連接e.EngineID = ev的事件ev .EngineID和ev.EventType ='TEST') –