背景 我使用下面的存储过程来检索每小时的时间序列数据。
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
,是否有一种简单的方法可以删除查询结果的最后一条记录(按上述程序进行轮回)?
答案 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的其他行。如果这是一个问题,第一种方法效果更好。