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

时间:2014-01-31 23:47:09

标签: 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(DataValue) FOR VariableID IN ([1],[3],[30]))
   PivotTable ORDER BY [DateTime]

通常,数据会在一小时内写入数据库,并且存储过程会在一小时后的5分钟执行,以检索所有现有值。

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

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

1 个答案:

答案 0 :(得分:1)

您可以使用row_number()

执行此操作
with cte as (
      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]
     )
select [DateTime], [1], [3], [30]
from (select cte.*, row_number() over (order by [DateTime] desc) as seqnum
      from cte
     ) t
where seqnum = 1 and [1] is null and [3] is null and [30] is null;

但是,我认为最简单的方法就是在pivot

之前进行过滤
      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的其他行。如果这是一个问题,第一种方法效果更好。