我有一張桌子,插入到每個夜晚都是數據的快照。在任何時候,數據可能在列中發生變化(AccountNo保持不變,RunKey增加1,RunDate增加1天;所有其他列可以改變特別)。下面是數據的外觀的例子:如何在SQL Server 2014中的數據發生更改時提取列名稱?
|AccountNo | RunKey | RunDate | Address | Salary | PromotionDate| ---------------------------------------------------------------------------- | 12345 | 2 | 06/20/2017 | 123 Main Street | 60,000 | 01/15/2017 | | 12345 | 3 | 06/21/2017 | 123 Main Street | 60,000 | 01/15/2017 | | 12345 | 4 | 06/22/2017 | 123 Main Street | 65,000 | 06/21/2017 |
使用LAG函數和CASE表達式我能確定何時有變化(1意味着它改變標誌):
|AccountNo | RunKey | RunDate | Address | AddressLAG |AddressFlag| Salary | SalaryLAG |SalaryFlag| PromotionDate|PromotionDateLag|PromotionFlag| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | 12345 | 2 | 06/20/2017 | 123 Main Street | 123 Main Street | 0 | 60,000 | 60,000 | 0 | 01/15/2017 | 01/15/2017 | 0 | | 12345 | 3 | 06/21/2017 | 123 Main Street | 123 Main Street | 0 | 60,000 | 60,000 | 0 | 01/15/2017 | 01/15/2017 | 0 | | 12345 | 4 | 06/22/2017 | 123 Main Street | 123 Main Street | 0 | 65,000 | 60,000 | 1 | 01/15/2017 | 06/21/2017 | 1 |
我只需要更改的記錄插入到一個新表,新表如下所示:
| RunKey | AccountNo | ChangedCol | PrevRunDate | RunDate | PrevValue | NewValue | ------------------------------------------------------------------------------------------- | 4 | 12345 | Salary | 06/21/2017 | 06/22/2017 | 60,000 | 65,000 | | 4 | 12345 | PromotionDate | 06/21/2017 | 06/22/2017 | 01/15/2017 | 06/21/2017 |
將有每列變化的新紀錄。因此,如果多列更改,每個更改都會記錄在一個新行中。這是我需要幫助的地方,我不知道如何動態地只將已更改的列插入到新表中。
您確定這是您想要如何進行劃轉或審覈更改?你可以看到這個很容易使用'除' – scsimon
我接受想法。這只是我的第一個想法,沒有人和我一起工作。我改變了數據以簡化它,但我正在處理費用和日期,問題是我們的管理員可能會問爲什麼發生了變化,並且我們有很多記錄是我們無法分辨的,所以我們要創建此表以追蹤任何改變,以便我們可以回到任何時間點,看看哪裏發生了變化以及變化是什麼。 – bm11
那麼你有點將數據轉換爲審計的新格式。這可能對你很好,但問題是你會使用這些數據?你將如何查詢它。你會做什麼聚合/等?把它放在這種格式中很難將其鏈接回任何數據集,這可能會導致一些問題。所以第一個問題是你將如何處理它。這將有助於確定這是否是一種合理的方法恕我直言 – scsimon