简体   繁体   English

SQL查询以从多个标签返回最后一个值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM