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]