TSQL:如果记录为空,如何从查询结果中删除最后一条记录

TSQL:如果记录为空,如何从查询结果中删除最后一条记录,sql,tsql,stored-procedures,null,Sql,Tsql,Stored Procedures,Null,背景: 我正在使用下面的存储过程来检索每小时的时间序列数据 SELECT * FROM ( SELECT CAST(LocalDateTime as SmallDateTime) as [DateTime], DataValue, VariableID FROM DataValues WHERE SiteID = 2 and VariableID IN(1,3,30) ) TableDate PIVOT (SUM(Da

背景: 我正在使用下面的存储过程来检索每小时的时间序列数据

SELECT *
   FROM (
      SELECT CAST(LocalDateTime as SmallDateTime) as [DateTime], DataValue, VariableID
         FROM DataValues
         WHERE SiteID = 2 and VariableID IN(1,3,30)
         ) TableDate
   PIVOT (SUM(DataValue) FOR VariableID IN ([1],[3],[30]))
   PivotTable ORDER BY [DateTime]
通常,数据在一小时的最高峰写入数据库,存储过程在一小时后5分钟执行,以检索所有现有值

问题是,对于许多站点中的一个站点,偶尔会在一小时内检索数据失败,因此没有新数据写入该站点的
DataValues
表。但是,最近的一小时仍然存在于
DataValues
表中,因为其他站点向其写入了值。这将生成一个查询结果,其中包含最近一小时的记录,但所有字段均为
NULL
。处理查询结果的代码可以处理任何原因导致的
NULL
小时数据,除非所有字段的最后一条记录都是
NULL

问题:
如果查询结果的最后一条记录的所有字段都是
NULL
,是否有一种简单的方法可以删除该记录(按上述过程旋转一次)?

您可以使用
行数()

然而,我认为最简单的方法就是在
透视之前进行过滤:

      SELECT *
      FROM (SELECT CAST(LocalDateTime as SmallDateTime) as [DateTime], DataValue, VariableID
            FROM DataValues
            WHERE DataValue is not null
            WHERE SiteID = 2 and VariableID IN (1, 3, 30)
           ) TableDate
      PIVOT (SUM(DataValue) FOR VariableID IN ([1],[3],[30])) PivotTable
      ORDER BY [DateTime]
这有一个潜在的缺点,即删除其他行中的
NULL
s。如果这是一个问题,第一种方法效果更好

      SELECT *
      FROM (SELECT CAST(LocalDateTime as SmallDateTime) as [DateTime], DataValue, VariableID
            FROM DataValues
            WHERE DataValue is not null
            WHERE SiteID = 2 and VariableID IN (1, 3, 30)
           ) TableDate
      PIVOT (SUM(DataValue) FOR VariableID IN ([1],[3],[30])) PivotTable
      ORDER BY [DateTime]