Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回多个标记的最后一个值的SQL查询_Sql_Sql Server_Sql Server 2008 R2_Greatest N Per Group - Fatal编程技术网

返回多个标记的最后一个值的SQL查询

返回多个标记的最后一个值的SQL查询,sql,sql-server,sql-server-2008-r2,greatest-n-per-group,Sql,Sql Server,Sql Server 2008 R2,Greatest N Per Group,我希望你能帮忙。我是SQL的新手,所以这个问题开始困扰我 目前,我每天都在为仪表名称收集数据。此数据当前记录在一个表中,该表的列为时间戳、名称、值。但是,我想创建一个查询,该查询只返回针对表中每个名称记录的最新(最后)值 到目前为止,我已经构建了这个查询,但是Top 1语法似乎不是我所需要的 SELECT Top 1 (DataLog.Timestamp), MeterTags.Name, DataLog.Value FROM Meters INNER JOIN MeterTags ON Met

我希望你能帮忙。我是SQL的新手,所以这个问题开始困扰我

目前,我每天都在为
仪表名称
收集数据。此数据当前记录在一个表中,该表的列为
时间戳、名称、值。但是,我想创建一个查询,该查询只返回针对表中每个
名称
记录的最新(最后)值

到目前为止,我已经构建了这个查询,但是
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
如果您能提供任何建议,我们将不胜感激

提前感谢。

您可以使用为每条记录指定一个行号(每个
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;
另一种解决方案是在一个:

您可以使用为每个记录指定一个行号(每个
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;
另一种解决方案是在一个:

尝试下面的查询

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
尝试下面的查询

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?抱歉,是SQL Server 2008 R2您使用的是什么DBMS?抱歉,是SQL Server 2008 R2时间戳没有以yyyy MM dd hh:MM:ss格式返回,SQL Server Management Studio正在以这种格式显示时间戳。有一个重要的区别。日期是日期,没有格式,只有当它显示为文本时才需要格式。我极力主张所有格式都应该在SQL之外的表示层中进行。数据库用于存储数据,表示层用于表示数据。您可以在SQL中使用
CONVERT(VARCHAR,timestamp,112)
来执行此操作,但是当发送到应用层时,这现在是一个字符串而不是日期,因此,您将无法将其作为日期进行操作。时间戳不会以yyyy MM dd hh:MM:ss格式返回,SQL Server Management Studio将以此格式显示时间戳。有一个重要的区别。日期是日期,没有格式,只有当它显示为文本时才需要格式。我极力主张所有格式都应该在SQL之外的表示层中进行。数据库是用来存储数据的,表示层是用来表示数据的。您可以在SQL中使用
CONVERT(VARCHAR,timestamp,112)
,但是当发送到应用层时,这现在是一个字符串而不是日期,因此您无法将其作为日期进行操作。