2013-10-01 115 views
1

我希望你能提供幫助。我是SQL的新手,所以這個開始困擾我。SQL Query返回來自多個標記的最後一個值

目前我每天都在收集數據爲Meter Name。此數據當前正在記錄在列表中,其列TimeStamp, Name, Value。但是,我想創建一個查詢,它只會返回表中每個Name記錄的最近(最後一個)值。

我已經建立了這個查詢,但Top 1語法似乎並不是我所需要的。

SELECT Top 1 (DataLog.Timestamp), MeterTags.Name, DataLog.Value 
FROM Meters 
INNER JOIN MeterTags 
ON Meters.MeterId = MeterTags.MeterId 
INNER JOIN DataLog 
ON MeterTags.MeterTagId = DataLog.MeterTagId 
WHERE Meters.MeterTypeId = 8 
GROUP By MeterTags.Name, DataLog.Timestamp 

任何意見,你可以給予讚賞。

在此先感謝。

+0

你正在使用哪些DBMS? – GarethD

+0

是SQL SERVER嗎? – SriniV

+0

道歉,是SQL Server 2008 R2 – user2547340

回答

1

您可以使用ROW_NUMBER給每個記錄ROWNUMBER(重置爲0每個MeterTags.Name),那麼只需要選擇先爲每個名字:

​​

另一種解決方案是使用TOP 1內的APPLY

SELECT DataLog.Timestamp, 
     MeterTags.Name, 
     DataLog.Value 
FROM Meters 
     INNER JOIN MeterTags 
      ON Meters.MeterId = MeterTags.MeterId 
     CROSS APPLY 
     ( SELECT TOP 1 TimeStamp, Value 
      FROM DataLog 
      WHERE MeterTags.MeterTagId = DataLog.MeterTagId 
      ORDER BY TimeStamp DESC 
     ) DataLog 
WHERE Meters.MeterTypeId = 8; 
+0

這兩個工作很好,非常感謝你 – user2547340

+0

時間戳沒有被返回格式爲yyyy-MM-dd hh:mm:ss,SQL Server Management Studio正在以這種格式顯示時間戳。 有一個重要的區別。日期是一個日期,沒有格式,只有當它顯示爲文本時才需要格式。 我是一個大提倡者**所有**格式應該在表示層的SQL之外完成。該數據庫用於存儲數據表示層爲 來呈現它。 – GarethD

+0

你可以使用'CONVERT(VARCHAR,timestamp,112)'在SQL中完成它,但是當它被髮送到應用程序層時,這現在是一個字符串而不是一個日期,所以你不能將它作爲一個日期。 – GarethD

0

下面的查詢嘗試

select Timestamp,Name,Value 
from 
(

SELECT (DataLog.Timestamp), MeterTags.Name, DataLog.Value,rownum,ROW_NUMBER() OVER 
(PARTITION BY MeterTags.Name ORDER BY DataLog.Timestamp desc) AS rownum FROM Meters 
INNER JOIN MeterTags 
ON Meters.MeterId = MeterTags.MeterId 
INNER JOIN DataLog 
ON MeterTags.MeterTagId = DataLog.MeterTagId 
)data 
    where rownum=1