Заполнение пропущенных пробелов (Sql Server 2005) [Набор на основе рекурсивного CTE] - PullRequest
0 голосов
/ 12 апреля 2010

у меня есть стол

MissingData

1
10
NULL
NULL
22
NULL

Желаемый результат будет

MissingData

1
10
10
10
22
22

т.е. нули будут заполнены предыдущим значением, пока не появится новое значение.

Я могу решить эту проблему с помощью цикла, но мое требование - решить его с помощью CTE, в котором я чувствую себя не очень комфортно.

Спасибо

1 Ответ

0 голосов
/ 12 апреля 2010

Порядок значений в вашем списке неявно является частью проблемы. Этот порядок должен храниться как часть данных в исходной таблице, иначе проблема не может быть надежно решена, даже в цикле. Я добавил «порядковый» столбец для представления отсутствующего порядка.

declare @orderedset table(ordinal int not null, value int null)

insert into @orderedset(ordinal, value) values (1, 100)
insert into @orderedset(ordinal, value) values (2, 10)
insert into @orderedset(ordinal, value) values (3, NULL)
insert into @orderedset(ordinal, value) values (4, NULL)
insert into @orderedset(ordinal, value) values (5, 22)
insert into @orderedset(ordinal, value) values (5, NULL);

WITH fillvalues AS
(
    SELECT ordinal, value FROM @orderedset
    WHERE value IS NOT NULL
)
SELECT 
(
    SELECT value FROM fillvalues
    WHERE fillvalues.ordinal = 
    (
        SELECT MAX(ordinal) 
        FROM fillvalues 
        WHERE ordinal <= unfilled.ordinal
    )
) As filledvalue
FROM @orderedset unfilled
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...