2017-11-24 4 views
1

인터넷 검색에 많은 시간을 할애하여 훨씬 간단한 테이블에 대한 가능한 해결책을 찾았습니다.SQL 데이터베이스의 변경 내용 추적

저희 회사는 200 개가 넘는 웹 서버에서 ~ 80 개의 속성을 추적하기 위해 BGInfo를 사용합니다. 이 필드는 서버 통계 (IP 주소, OSVer, HyperV 호스트)와 다양한 설치된 소프트웨어 구성 요소의 버전을 혼합 한 것입니다. 예약 된 작업은이 정보를 매일 모든 웹 서버에서 단일 데이터베이스 (현재 300,000 개 레코드)에 기록합니다. 특정 웹 서버에서 무언가가으로 변경된 시간을 알려주는 쿼리가 필요합니다 (보고서에 입력해야 함). 자동 변 경 제어의 일종.

예 : WebSvr_XYZ는 몇 달 후 추가 RAM이 할당되기 전에 처음 2G의 RAM을 사용했습니다. 그 후 1 년 후 새로운 IP 주소가 부여되었습니다. WebSvr_XYZ에 대해 실행하면

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 

, 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)을 사용하십시오. 하지만 나쁜 타임 스탬프를 받거나 전혀 결과가 없습니다.

답변

0

이벤트 시퀀스로 row_number()을 사용하십시오. 그 후에는 이전 타임 스탬프와 현재 타임 스탬프를 비교하는 자체 내부 데이터를 다시 확인할 수 있습니다.

; 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