我试图填写Col4'使用' Col1'使用上述值的空值和Col3'。以下是对列的简要说明:
目前的数据是什么样的:
| Col1 | Col2 | Col3 | Col4
| 2016-01-01 | 2016-01-01 | 3 | $10
| null | 2016-01-02 | null | null
| null | 2016-01-03 | null | null
| 2016-01-04 | 2016-01-04 | 1 | $2
| 2016-01-05 | 2016-01-05 | 2 | $7
| null | 2016-01-06 | null | null
| 2016-01-07 | 2016-01-07 | 3 | $5
| null | 2016-01-08 | null | null
| null | 2016-01-09 | null | null
预期成绩:
| Col1 | Col2 | Col3 | Col4
| 2016-01-01 | 2016-01-01 | 3 | $10
| null | 2016-01-02 | null | $10
| null | 2016-01-03 | null | $10
| 2016-01-04 | 2016-01-04 | 1 | $2
| 2016-01-05 | 2016-01-05 | 2 | $7
| null | 2016-01-06 | null | $7
| 2016-01-07 | 2016-01-07 | 3 | $5
| null | 2016-01-08 | null | $5
| null | 2016-01-09 | null | $5
该公式通过计算Col3中的数字然后将Col4中的相应数量复制到下面的行来工作。 Col3定义了下面的行数(包括它自己的行)。
我目前正在使用Sybase。我对如何做到这一点没有任何想法。任何帮助将不胜感激。 注意:这是一个数据样本,日期从2000年到2016年
答案 0 :(得分:0)
在SQL Server中通过给定的样本数据,我们可以通过使用CTE
来实现上述结果集示例数据:
declarE @Table1 TABLE
(Col1 varchar(10), Col2 varchar(10), Col3 varchar(4), Col4 varchar(4))
;
INSERT INTO @Table1
(Col1, Col2, Col3, Col4)
VALUES
('2016-01-01', '2016-01-01', '3', '$10'),
(NULL, '2016-01-02', NULL, NULL),
(NULL, '2016-01-03', NULL, NULL),
('2016-01-04', '2016-01-04', '1', '$2'),
('2016-01-05', '2016-01-05', '2', '$7'),
(NULL, '2016-01-06', NULL, NULL),
('2016-01-07', '2016-01-07', '3', '$5'),
(NULL, '2016-01-08', NULL, NULL),
(NULL, '2016-01-09', NULL, NULL)
;
脚本:
WITH cte
AS (SELECT T1.Col1,
T1.Col2,
T1.Col3,
Col4 = COALESCE(T1.Col4, (SELECT TOP 1 Col4
FROM @Table1 T2
WHERE T2.Col2 < T1.Col2
AND Col4 IS NOT NULL
ORDER BY Col2 DESC))
FROM @Table1 T1)
UPDATE T
SET
T.Col4 = C.Col4
FROM @Table1 T
INNER JOIN cte C
ON T.col2 = C.col2
WHERE T.col1 IS NULL
OR T.col2 IS NULL
OR T.col3 IS NULL
Select * from @Table1