jaykeymailbox Ответов: 1

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


Кодклиента " Имя " CreateDate
1 Иона 2011-09-01 00:00:00.000
2 Джонатан нуль
3 Лено 2014-05-05 00:00:00.000
4 Джеймс нуль
5 Том 2018-05-01 00:00:00.000
6 Гарри нуль
7 Рикки нуль
8 Катерина нулевая

Проблема : замените нулевые значения в столбце даты из не нулевого значения выше.
Я использую case statement, чтобы получить ниже результат, но он очень медленный.
Ожидаемый результат:
CreateDate CreateDate
2011-09-01 00:00:00.000 2011-09-01 00:00:00.000
NULL 2011-09-01 00:00:00.000
2014-05-05 00:00:00.000 2014-05-05 00:00:00.000
NULL 2014-05-05 00:00:00.000
2018-05-01 00:00:00.000 2018-05-01 00:00:00.000
NULL 2018-05-01 00:00:00.000
NULL 2018-05-01 00:00:00.000
NULL 2018-05-01 00:00:00.000

Что я уже пробовал:

Выберите главное.CreateDate,случай, когда CreateDate равен NULL
Затем (выберите TOP 1 sub.CreateDate из dbo.Суб поддержки, где суб.CustomerID <= main.CustomerID
заказ по субмарине.CreateDate алфавиту )
Остальное главное.CreateDate
Конец как CreateDate
От ДБО.Основным заказчиком ;

1 Ответов

Рейтинг:
2

Richard Deeming

Предполагая, что SQL 2012 или выше, эта техника от Dwayn Camps может помочь:

WITH cteCount As
(
    SELECT
        CustomerID,
        FirstName,
        CreateDate,
        COUNT(CreateDate) OVER (ORDER BY CustomerID) As C
    FROM
        dbo.Customer
),
cteRN As
(
    SELECT
        CustomerID,
        FirstName,
        CreateDate,
        ROW_NUMBER() OVER (PARTITION BY C ORDER BY CustomerID) - 1 As RN
    FROM
        cteCount
)
SELECT
    CustomerID,
    FirstName,
    CreateDate,
    CASE
        WHEN CreateDate Is Not Null THEN CreateDate
        ELSE LAG(CreateDate, RN) OVER (ORDER BY CustomerID, CreateDate)
    END As CreateDate
FROM
    cteRN
ORDER BY
    CustomerID
;

Заполнение недостающих значений с помощью оконной рамы T-SQL - простой разговор[^]