Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 创建引用其他列及其值的列?_Sql_Sql Server_Dynamic Sql_Data Munging - Fatal编程技术网

Sql 创建引用其他列及其值的列?

Sql 创建引用其他列及其值的列?,sql,sql-server,dynamic-sql,data-munging,Sql,Sql Server,Dynamic Sql,Data Munging,我试图创建一个时间序列,显示特定列在特定时间的值。我目前可以访问的只是一个表,它记录了所有的更改、列的当前值、日期以及被更改的列的名称。我想创建一个新的列,跟踪该列在更改之前的日期上的值。“Column_name”中引用的更改中有超过63列 这就是我现在拥有的 ________________________________________________ Name | date |A | B |C |NEW | Column_name| bob | 12302019|2 |

我试图创建一个时间序列,显示特定列在特定时间的值。我目前可以访问的只是一个表,它记录了所有的更改、列的当前值、日期以及被更改的列的名称。我想创建一个新的列,跟踪该列在更改之前的日期上的值。“Column_name”中引用的更改中有超过63列

这就是我现在拥有的

________________________________________________
Name |  date    |A  | B  |C  |NEW | Column_name|
bob  |  12302019|2  | 23 |153|2   | a          |
bob  |  12102019|2  | 23 |153|362 | a          |
bob  |  10242019|2  | 23 |153|7   | a          | 
john |  10062017|684| 452|1  |254 | c          |
john |  11052018|684| 452|1  |1   | c          |
________________________________________________

这是我想要帮助创建的

_____________________________________________________
Name |  date    |A  | B  |C  |NEW | Column_name| Old |
bob  |  12302019|2  | 23 |153|2   | a          | 362 | 
bob  |  12102019|2  | 23 |153|362 | a          | 7   |
bob  |  10242019|2  | 23 |153|7   | a          |     | 
john |  10062017|684| 452|1  |254 | c          | 458 |
john |  11052018|684| 452|1  |1   | c          | 254 |
______________________________________________________
您似乎想要延迟:


你已经得到了答案,它是滞后的:

CREATE TABLE #test
(
    UserName VARCHAR(20),
    TheDate DATE,
    A INT,
    B INT,
    C INT,
    ColumnName NVARCHAR(128),
    New INT
);

INSERT INTO #test(UserName, TheDate, A, B, C, ColumnName, New)
VALUES 
('bob', '20191230', 2, 23, 153, 'a', 2),
('bob', '20191210', 2, 23, 153, 'a', 362),
('bob', '20191024', 2, 23, 153, 'a', 7),
('john', '20171006', 684, 452, 1, 'c', 458),
('john', '20181105', 684, 452, 1, 'c', 254);

SELECT *, LAG(New) OVER(PARTITION BY A, B, C, ColumnName ORDER BY TheDate) AS Old
FROM #test
ORDER BY A, B, C, TheDate;

458是从哪里来的?很抱歉,这将来自以前的输入,因为它不在时间范围内,所以不会被捕获。在完整的数据集中,列名下有60多个不同的因素。有没有办法做到这一点而不将它们全部列出?我试图使用子查询,但通过从dmhi中选择不同的dmhi.field,dmhi.field ORDER BY dmhi.effective AS Old from cust left join dmd on dmd.rowno\u custdmd\u cust=cust.rowno left join dmhi on dmd返回错误。rowno=dmhi.rowno\u dmddmhi\u dmd where dmhi.field!“”子查询返回了多个值。这是不允许的…@DominicNaimool。我不确定我是否完全理解你的问题。SQLServer没有处理多列的捷径,但在电子表格中生成代码非常简单。如果你问一个更接近你真正想做什么的问题,可能还有其他方法。我明白了,对我来说,真正的问题是可能会定期向数据库中添加列。如果发生这种情况,那么基于静态列表的代码不会捕获这些列的更改,也许我应该考虑其他选项。谢谢你的帮助!
CREATE TABLE #test
(
    UserName VARCHAR(20),
    TheDate DATE,
    A INT,
    B INT,
    C INT,
    ColumnName NVARCHAR(128),
    New INT
);

INSERT INTO #test(UserName, TheDate, A, B, C, ColumnName, New)
VALUES 
('bob', '20191230', 2, 23, 153, 'a', 2),
('bob', '20191210', 2, 23, 153, 'a', 362),
('bob', '20191024', 2, 23, 153, 'a', 7),
('john', '20171006', 684, 452, 1, 'c', 458),
('john', '20181105', 684, 452, 1, 'c', 254);

SELECT *, LAG(New) OVER(PARTITION BY A, B, C, ColumnName ORDER BY TheDate) AS Old
FROM #test
ORDER BY A, B, C, TheDate;