【问题标题】:Create a column which references other columns and their values?创建一个引用其他列及其值的列?
【发布时间】:2019-12-09 16:52:38
【问题描述】:

我正在尝试创建一个时间序列,以显示特定列在特定时间的值。我目前只能访问一个记录所有更改、列的当前值、日期和被更改的列的名称的表。我想创建一个新列来跟踪该列的先前值在更改之前的日期是什么。 “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 |
______________________________________________________

【问题讨论】:

  • “458”从何而来?
  • 抱歉,这将来自先前的输入,由于超出时间范围而无法捕获

标签: sql sql-server dynamic-sql data-munging


【解决方案1】:

你似乎想要lag()

select t.*,
       lag(new) over (partition by name order by date) as old
from t;

【讨论】:

  • 在完整数据集中的列名下有 60 多个不同的因素,有没有办法在不列出所有因素的情况下做到这一点?我尝试使用子查询并返回错误 Select *,LAG(dmhi.value_) OVER(PARTITION BY (select distinct dmhi.field from dmhi),dmhi.field ORDER BY dmhi.effective) AS Old from cust left join dmd on dmd.rowno_custdmd_cust = cust.rowno left join dmhi on dmd.rowno=dmhi.rowno_dmddmhi_dmd where dmhi.field != ' ' 子查询返回超过 1 个值。这是不允许的...
  • @DominicNaimool 。 . .我不确定我是否完全理解您的问题。 SQL Server 没有处理多列的捷径,但在电子表格中生成代码很容易。如果您提出的问题更接近您真正想做的事情,可能还有其他方法。
  • 我明白了,对我来说真正的问题是列可能会定期添加到数据库中。如果发生这种情况,那么基于静态列表的代码将无法捕获对这些列的更改,也许我应该考虑其他选项。感谢您的帮助!
【解决方案2】:

你已经得到答案了,它是 LAG():

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多