2017-11-24 11 views
1

私はグーグルで多くの時間を費やし、ずっと単純なテーブルの可能な解決策を見出しました。SQLデータベース内の変更を追跡する

私の会社はBGInfoを宗教的に使用して、200以上のWebサーバーで〜80のプロパティを管理しています。これらのフィールドには、サーバーの統計情報(IPアドレス、OSVer、HyperVホスト)と、インストールされているさまざまなソフトウェアコンポーネントのバージョンが混在しています。スケジュールされたタスクは、この情報をすべてのWebサーバーに毎日1つのデータベースに書き込みます(現在は300Kを超えるレコード)。特定のWebサーバー上での何かがに変更された時刻を与えるために、(最終的にレポートにフィードされる)クエリが必要です。自動チェンジコントロールの一種。

例:WebSvr_XYZには、数ヶ月後に追加のRAMを割り当てる前に2GのRAMが使用されていました。それから1年後、新しいIPアドレスが与えられました。 WebSvr_XYZに対して実行する場合は、540を超えるレコードに対する出力は、私は彼らがすべての関連する列に入社、完全なテーブルに対してそれを結合テーブルに対してSELECT DISTINCTを試してみた

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 

だろう

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 

最初に取得するにはMIN(Timestamp)を使用します。しかし、私は悪いタイムスタンプを得るか全く結果を得ません。

答えて

0

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 
関連する問題