希望您能提供帮助。我是SQL的新手,所以这个人开始困扰我。
目前,我每天都在收集数据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为每个记录赋予行号(每个重置为0 MeterTags.Name
),然后为每个名称选择第一个:
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;
另一个解决方案是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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句