【发布时间】:2012-05-18 14:28:20
【问题描述】:
我在 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 的尝试都失败了。
【问题讨论】:
-
你试过什么?发布您到目前为止所做的事情会很有帮助 - 您可能已经很接近并且只需要一些建议来更正您现有的查询。
-
因为我不知道一行中有多少个空值,所以前一小时的单个连接是不够的。在那里我想也许我可以通过某种方式递归解决它。我只使用经典层次结构方式的 CTE 递归,但我的想法是,如果我可以在递归中每次更新一个空值,也许我可以将它们全部填充。实际上我在尝试这个想法时很早就失去了它。所以我不相信会有什么帮助。
-
在您的示例中,
Values 不会随着Date的增加而减少。这是巧合,还是永远如此? -
+1 用于实际包含工作表的“起点”和数据插入代码
标签: sql-server tsql common-table-expression