我需要使用基于NULL
&的最后一个已知值的新值更新ID
值。 DATE
列。请注意,每当ID
列发生更改时,非空值更新都应更改。
以下示例查询Null
在L2&中被替换为5 01-12-2016行,但它应为null,因为ID
更改为L2,5从L1行引入。但是,只要R_ID
发生变化,我就需要ID
。
我的表有9000万行,更新过程应该尽可能快。
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);
答案 0 :(得分:0)
一种方法是在内部查询中使用update语句:
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