2013-10-01 79 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