[英]SQL Query to return last value from a number of tags
I hope you might be able to help. 希望您能提供帮助。 I'm a novice at SQL so this one is starting to bug me.
我是SQL的新手,所以这个人开始困扰我。
Currently I am collecting data every day for a Meter Name
. 目前,我每天都在收集有关
Meter Name
。 This data is currently being logged in a table with the columns TimeStamp, Name, Value
. 当前,此数据记录在带有
TimeStamp, Name, Value
列的表中。 However I would like to create a query which will only return the most recent (last) value recorded against each Name
in the table. 但是,我想创建一个查询,该查询将仅返回针对表中每个
Name
记录的最新(最后)值。
I've built this query so far but the Top 1
syntax doesn't seem to be what I need. 到目前为止,我已经构建了此查询,但是
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
Any advice you could give would be appreciated. 您可以提供的任何建议将不胜感激。
Thanks in advance. 提前致谢。
You can use ROW_NUMBER to give each record a rownumber (resetting to 0 for each MeterTags.Name
) then just select the first for each name: 您可以使用ROW_NUMBER为每个记录赋予行号(将每个
MeterTags.Name
重置为0),然后为每个名称选择第一个:
WITH CTE AS
( SELECT DataLog.Timestamp,
MeterTags.Name,
DataLog.Value,
RowNumber = ROW_NUMBER() OVER(PARTITION BY MeterTags.Name
ORDER BY DataLog.TimeStamp DESC)
FROM Meters
INNER JOIN MeterTags
ON Meters.MeterId = MeterTags.MeterId
INNER JOIN DataLog
ON MeterTags.MeterTagId = DataLog.MeterTagId
WHERE Meters.MeterTypeId = 8
)
SELECT CTE.Timestamp,
CTE.Name,
CTE.Value
FROM CTE
WHERE CTE.RowNumber = 1;
Another solution is to use the TOP 1
inside an APPLY : 另一种解决方案是在APPLY中使用
TOP 1
:
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;
Try below query 尝试以下查询
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.