[英]Tracking changes in a SQL database
我花了很多時間在Google上搜索,並找到了對更簡單的表的可能解決方案。
我公司虔誠地使用BGInfo來跟蹤200多個Web服務器上的約80個屬性。 這些字段是服務器狀態(IP地址,OSVer,HyperV主機)和各種已安裝軟件組件的版本的混合。 計划任務每天將所有Web服務器的此信息寫入一個數據庫(當前記錄> 300K)。 我們需要一個查詢(最終將其輸入到報告中),以便給我們提供時間,以了解任何給定的Web服務器上發生了什么更改。 如果可以的話,這是一種自動變更控制。
示例:WebSvr_XYZ自創建以來就擁有2G的RAM,然后在幾個月后分配了額外的RAM。 然后一年后,它被賦予了一個新的IP地址。
Server Time_stamp Host IP RAM
-------------------------------------------------------
WebSvr_XYZ June 1, 2016 Virt5a 192.168.10.45 2G
WebSvr_XYZ June 2, 2016 Virt5a 192.168.10.45 2G
WebSvr_XYZ Aug 20, 2016 Virt5a 192.168.10.45 4G
WebSvr_XYZ Aug 21, 2016 Virt5a 192.168.10.45 4G
WebSvr_XYZ July 18, 2017 Virt5a 192.168.20.105 4G
WebSvr_XYZ July 19, 2017 Virt5a 192.168.20.105 4G
WebSvr_XYZ July 20, 2017 Virt5a 192.168.20.105 4G
當針對WebSvr_XYZ
運行時,針對540多個記錄的輸出將是
June 1, 2016 Virt5a 192.168.10.45 2G
Aug 20, 2016 Virt5a 192.168.10.45 4G
July 18, 2017 Virt5a 192.168.20.105 4G
我已經嘗試過將選擇與表分離,將它們與整個表連接起來,在所有相關列上進行連接,並使用MIN(Timestamp)
來獲得第一個。 但是我要么得到不好的時間戳,要么根本沒有結果。
使用row_number()
作為事件序列。 之后,您可以INNER JOIN返回自身的數據,以比較之前的時間戳和當前的時間戳
; with cte as
(
select *, rn = row_number() over (partition by Server order by Time_stamp)
from yourtable
)
select *
from cte c1
inner join c2 on c1.Server = c2.Server
and c1.rn = c2.rn - 1
where c1.IP <> c2.IP
or c1.RAM <> c2.RAM
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.