2017-01-02 5 views
0

Мне нужно обновить значения NULL с новым значением из последнего известного значения на основе ID & DATE столбцов. Обратите внимание, что обновление ненулевого значения должно меняться при изменении столбца ID.атрибут, связанный с атрибутом в другой таблице в SQL Server

В приведенном ниже примере запрос, Null заменяются 5 в L2 & 01-12-2016 строку, но оно должно быть нулевым, как ID изменяется на L2 и 5, в результате чего из L1 строки. Но мне нужно получить R_ID, когда ID меняется.

В моей таблице 90 миллионов строк, и процесс обновления должен быть как можно быстрее.

CREATE TABLE #temp 
(
    ID nvarchar(10), 
    DATE date, 
    R_ID INT 
); 

INSERT INTO #temp 
    SELECT 'L1', '2016-12-01', NULL 
    UNION ALL 
    SELECT 'L1', '2016-12-02', 5 
    UNION ALL 
    SELECT 'L1', '2016-12-03', NULL 
    UNION ALL 
    SELECT 'L2', '2016-12-01', NULL 
    UNION ALL 
    SELECT 'L2', '2016-12-02', 8 
    UNION ALL 
    SELECT 'L2', '2016-12-03', NULL 
    UNION ALL 
    SELECT 'L3', '2016-12-03', 3 
    UNION ALL 
    SELECT 'L3', '2016-12-04', NULL 
    UNION ALL 
    SELECT 'L3', '2016-12-04', NULL ; 

DECLARE @R_ID INT; 

UPDATE #temp WITH(TABLOCKX) 
SET @R_ID = R_ID = CASE WHEN R_ID IS NULL THEN @R_ID ELSE R_ID END 
OPTION(MAXDOP 1); 

enter image description here

ответ

0

Один из способов сделать это является использование во внутреннем запросе для обновления заявление: обновление

UPDATE t1 
SET R_ID = ISNULL(R_ID, (
         SELECT TOP 1 R_ID 
         FROM #Temp t2 
         WHERE t2.ID = t1.Id 
         AND T2.[DATE] < t1.[DATE] 
         AND t2.R_ID IS NOT NULL 
         ORDER BY [DATE] DESC) 
       ) 
FROM #Temp t1 

Тест:

SELECT * 
FROM #Temp 

Результаты:

ID DATE     R_ID 
L1 01.12.2016 00:00:00  NULL 
L1 02.12.2016 00:00:00  5 
L1 03.12.2016 00:00:00  5 
L2 01.12.2016 00:00:00  NULL 
L2 02.12.2016 00:00:00  8 
L2 03.12.2016 00:00:00  8 
L3 03.12.2016 00:00:00  3 
L3 04.12.2016 00:00:00  3 
L3 04.12.2016 00:00:00  3 
+0

Логика работает, но запрос занимает больше часа, чтобы обновить записи на 90 м. – Rajini

+0

Ну, если 90 м относится к 90 000 000 записей, то это не так долго для обновления с подзапросом ... –