返回多个标记的最后一个值的SQL查询
我希望你能帮忙。我是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
仪表名称
收集数据。此数据当前记录在一个表中,该表的列为时间戳、名称、值。但是,我想创建一个查询,该查询只返回针对表中每个名称记录的最新(最后)值
到目前为止,我已经构建了这个查询,但是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)
,但是当发送到应用层时,这现在是一个字符串而不是日期,因此您无法将其作为日期进行操作。