Sql server 跟踪SQL数据库中的更改

Sql server 跟踪SQL数据库中的更改,sql-server,distinct,Sql Server,Distinct,我花了大量时间在谷歌上搜索,并找到了解决更简单表格的可能方法 我的公司虔诚地使用BGInfo跟踪200多台web服务器上的80个属性。这些字段混合了服务器统计IP地址、OSVer、HyperV主机和各种已安装软件组件的版本。计划任务每天将此信息写入所有web服务器到单个数据库,当前记录数>300K。我们需要一个查询最终被输入到一个报告中,以给出在任何给定的web服务器上发生变化的时间。一种自动变更控制,如果你愿意的话 示例:WebSvr_XYZ从一开始就使用2G的RAM,几个月后才分配额外的RA

我花了大量时间在谷歌上搜索,并找到了解决更简单表格的可能方法

我的公司虔诚地使用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
我尝试了针对表的select distinct,他们将其与完整表连接,在所有相关列上连接,并使用MINTimestamp获得第一个。但我要么得到错误的时间戳,要么根本没有结果。

使用行号作为事件序列。之后,您可以内部连接回它自己的数据,以比较前一个时间戳和当前时间戳

; 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
使用行号作为事件序列。之后,您可以内部连接回它自己的数据,以比较前一个时间戳和当前时间戳

; 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