sql 复制副本
sql copying duplicates
我正在尝试使用 'Col1' 和 'Col3' 将上述值填充 'Col4' 空值。以下是对列的简要说明:
Col1 - 用户输入日期
Col2 - 日历日期
Col3 - Col1 中日期之间的差异
Col4 - 入场金额
目前的数据是什么样的:
| Col1 | Col2 | Col3 | Col4
| 2016-01-01 | 2016-01-01 | 3 |
| null | 2016-01-02 | null | null
| null | 2016-01-03 | null | null
| 2016-01-04 | 2016-01-04 | 1 |
| 2016-01-05 | 2016-01-05 | 2 |
| null | 2016-01-06 | null | null
| 2016-01-07 | 2016-01-07 | 3 |
| null | 2016-01-08 | null | null
| null | 2016-01-09 | null | null
预期成绩:
| Col1 | Col2 | Col3 | Col4
| 2016-01-01 | 2016-01-01 | 3 |
| null | 2016-01-02 | null |
| null | 2016-01-03 | null |
| 2016-01-04 | 2016-01-04 | 1 |
| 2016-01-05 | 2016-01-05 | 2 |
| null | 2016-01-06 | null |
| 2016-01-07 | 2016-01-07 | 3 |
| null | 2016-01-08 | null |
| null | 2016-01-09 | null |
该公式的工作原理是计算 Col3 中的数字,然后将 Col4 中的相应数量复制到下面的行中。 Col3 定义下面的行数(包括它自己的行)。
我目前正在使用 Sybase。我对如何做到这一点没有任何想法。任何帮助将不胜感激谢谢。
注意:这是一个数据样本,日期从 2000 年到 2016 年
在SQL服务器中通过给定样本数据我们可以使用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', ''),
(NULL, '2016-01-02', NULL, NULL),
(NULL, '2016-01-03', NULL, NULL),
('2016-01-04', '2016-01-04', '1', ''),
('2016-01-05', '2016-01-05', '2', ''),
(NULL, '2016-01-06', NULL, NULL),
('2016-01-07', '2016-01-07', '3', ''),
(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
我正在尝试使用 'Col1' 和 'Col3' 将上述值填充 'Col4' 空值。以下是对列的简要说明:
| Col1 | Col2 | Col3 | Col4
| 2016-01-01 | 2016-01-01 | 3 |
| null | 2016-01-02 | null | null
| null | 2016-01-03 | null | null
| 2016-01-04 | 2016-01-04 | 1 |
| 2016-01-05 | 2016-01-05 | 2 |
| null | 2016-01-06 | null | null
| 2016-01-07 | 2016-01-07 | 3 |
| null | 2016-01-08 | null | null
| null | 2016-01-09 | null | null
预期成绩:
| Col1 | Col2 | Col3 | Col4
| 2016-01-01 | 2016-01-01 | 3 |
| null | 2016-01-02 | null |
| null | 2016-01-03 | null |
| 2016-01-04 | 2016-01-04 | 1 |
| 2016-01-05 | 2016-01-05 | 2 |
| null | 2016-01-06 | null |
| 2016-01-07 | 2016-01-07 | 3 |
| null | 2016-01-08 | null |
| null | 2016-01-09 | null |
该公式的工作原理是计算 Col3 中的数字,然后将 Col4 中的相应数量复制到下面的行中。 Col3 定义下面的行数(包括它自己的行)。
我目前正在使用 Sybase。我对如何做到这一点没有任何想法。任何帮助将不胜感激谢谢。 注意:这是一个数据样本,日期从 2000 年到 2016 年
在SQL服务器中通过给定样本数据我们可以使用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', ''),
(NULL, '2016-01-02', NULL, NULL),
(NULL, '2016-01-03', NULL, NULL),
('2016-01-04', '2016-01-04', '1', ''),
('2016-01-05', '2016-01-05', '2', ''),
(NULL, '2016-01-06', NULL, NULL),
('2016-01-07', '2016-01-07', '3', ''),
(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