SQL Query返回来自多个标记的最后一个值
我希望你能提供帮助。我是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
任何意见,你可以给予赞赏。
在此先感谢。
您可以使用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;
这两个工作很好,非常感谢你 – user2547340
时间戳没有被返回格式为yyyy-MM-dd hh:mm:ss,SQL Server Management Studio正在以这种格式显示时间戳。 有一个重要的区别。日期是一个日期,没有格式,只有当它显示为文本时才需要格式。 我是一个大提倡者**所有**格式应该在表示层的SQL之外完成。该数据库用于存储数据表示层为 来呈现它。 – GarethD
你可以使用'CONVERT(VARCHAR,timestamp,112)'在SQL中完成它,但是当它被发送到应用程序层时,这现在是一个字符串而不是一个日期,所以你不能将它作为一个日期。 – GarethD
下面的查询尝试
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
你正在使用哪些DBMS? – GarethD
是SQL SERVER吗? – SriniV
道歉,是SQL Server 2008 R2 – user2547340