sql-server - T-SQL 查询更新空值

标签 sql-server tsql common-table-expression

我在 T-SQL 中遇到了一个非常具体的问题。

如果我能解决我给你的这个示例案例,我想我将能够解决我原来的案例。

将这些数据放在一个表中:

DECLARE @Test TABLE
(
    Value INT
    ,Date DATETIME2(7)
);

INSERT INTO @Test
VALUES
(NULL, '2011-01-01 10:00'),
(NULL, '2011-01-01 11:00'),
(2, '2011-01-01 12:00'),
(NULL, '2011-01-01 13:00'),
(3, '2011-01-01 14:00'),
(NULL, '2011-01-01 15:00'),
(NULL, '2011-01-01 16:00'),
(4, '2011-01-01 17:00'),
(NULL, '2011-01-01 18:00'),
(5, '2011-01-01 19:00'),
(6, '2011-01-01 20:00')

我需要选择这个输出:

Value   Date
2       2011-01-01 10:00
2       2011-01-01 11:00
2       2011-01-01 12:00
2       2011-01-01 13:00
3       2011-01-01 14:00
3       2011-01-01 15:00
3       2011-01-01 16:00
4       2011-01-01 17:00
4       2011-01-01 18:00
5       2011-01-01 19:00
6       2011-01-01 20:00

给出一些解释。如果某个地方的值为 NULL,我需要使用前一小时的值进行更新。如果一行中有多个空值,则最接近的较早时间的非空值将传播并填充所有这些空值。此外,如果一天中的第一个小时为空,那么在本例中,具有非空值的当天最早的一小时会像 2 一样向下传播。在您的情况下,您可以假设至少一个值是非空值。

我的目标是使用公用表表达式或类似的东西来解决这个问题。如果我尝试使用游标方式,我想我会在短时间内找到解决方案,但到目前为止,我对 CTE 和递归 CTE 的尝试都失败了。

最佳答案

由于您的情况并不总是相同,所以这有点困难。在您的示例中,前两行需要从日期较晚的第一个值获取它们的值,在其他情况下,它们需要从以前的日期获取值。如果您总是需要查看以前的日期,您可以简单地执行此查询:

SELECT  B.Value,
        A.[Date]
FROM @Test A
OUTER APPLY (SELECT TOP 1 *
             FROM @Test
             WHERE [Date] <= A.[Date] AND Value IS NOT NULL
             ORDER BY [Date] DESC) B

但在你的情况下,我认为你需要这个:

SELECT  ISNULL(B.Value,C.Value) Value,
        A.[Date]
FROM @Test A
OUTER APPLY (SELECT TOP 1 *
             FROM @Test
             WHERE [Date] <= A.[Date] AND Value IS NOT NULL
             ORDER BY [Date] DESC) B
OUTER APPLY (SELECT TOP 1 *
             FROM @Test
             WHERE Value IS NOT NULL
             ORDER BY [Date]) C

关于sql-server - T-SQL 查询更新空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10654508/

相关文章:

mysql - 连接 3 个三个表时使用内部联接查询时出错

tsql - 如何使零 tablix 数据行出现?

c# - 基于服务的数据库和本地数据库之间的混淆

sql - SQL Server中 '@@'的用法是什么

sql - 根据另一列重置运行总计

sql - 使用临时列过滤结果

sql - 无法在 Snowflake 中具有混合数据类型的字段上内部连接两个简单的 CTE

rdbms - 存储/访问有向图的最佳方式

sql-server - SQL Server 如何将 5 分钟的间隔重新组合为 15 分钟的间隔?

sql - 如何使用本地镜像生产 SQL Server 数据库并能够在一段时间内更改本地数据库?