2011-01-20 10 views
12

私はいくつかの検索を行っていますが、私が探している結果が得られないようです。基本的に私たちは全社的に4つの異なる管理システムを用意しており、各システムのすべてのデータを定期的に組み合わせています。私の目標は、1時間ごとに中央データベースにデータを更新することです。データベースから各グループの最後のレコードを取得しています - SQL Server 2005/2008

COMPUTERNAME | SERIALNUMBER | USERNAME | LASTIP | LASTUPDATE | SOURCE 
TEST1 | 1111 | BOB | 1.1.1.1 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 
TEST1 | 1111 | BOB | 1.1.1.1 | 1/18/2011 01:00:00 | MGMT_SYSTEM_2 
TEST1 | 1111 | PETER | 1.1.1.11 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 
TEST2 | 2222 | GEORGE | 1.1.1.2 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 
TEST3 | 3333 | TOM | 1.1.1.3 | 1/19/2011 01:00:00 | MGMT_SYSTEM_2 
TEST4 | 4444 | MIKE | 1.1.1.4 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 
TEST4 | 4444 | MIKE | 1.1.1.41 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 
TEST5 | 5555 | SUSIE | 1.1.1.5 | 1/19/2011 01:00:00 | MGMT_SYSTEM_1 

だから私はこのマスターテーブルを照会するだけ(LASTUPDATEに基づく)最新の記録私は、そのシステムについての最新情報を得ることができる方法を検索:ここでは私が働いているサンプルデータセットです。問題は、各データベースに1つのシステムが存在することですが、もちろん正確な更新時間は決してありません。

私はこのような何かを得ることを期待する:

TEST1 | 1111 | PETER | 1.1.1.11 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 
TEST2 | 2222 | GEORGE | 1.1.1.2 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 
TEST3 | 3333 | TOM | 1.1.1.3 | 1/19/2011 01:00:00 | MGMT_SYSTEM_2 
TEST4 | 4444 | MIKE | 1.1.1.41 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 
TEST5 | 5555 | SUSIE | 1.1.1.5 | 1/19/2011 01:00:00 | MGMT_SYSTEM_1 

私は、MAX関数を使用して試してみましたが、それを私は1つの列のみを取得することができます。私は最後の更新されたレコードを与えるユニークなIDフィールドを持っていないので、私はサブクエリでそれを使用することはできません。 1つのシステムはMySQLデータベースであり、MySQLのMAX機能は実際にはGROUP BYごとに1つのレコードを返すだけの方法で動作しますが、SQL Serverでは機能しません。

私はMAXとLEFT JOINを使用する必要があると思っていますが、これまでの試みは失敗しました。

ご協力いただき誠にありがとうございます。私は、過去3〜4時間の間、私の脳をラッキーにして、うまくいきました。このマスタテーブルは、SQL Server 2005サーバー上にあります。

ありがとうございます!

答えて

32
;with cteRowNumber as (
    select COMPUTERNAME, SERIALNUMBER, USERNAME, LASTIP, LASTUPDATE, SOURCE, 
      row_number() over(partition by COMPUTERNAME order by LASTUPDATE desc) as RowNum 
     from YourTable 
) 
select COMPUTERNAME, SERIALNUMBER, USERNAME, LASTIP, LASTUPDATE, SOURCE 
    from cteRowNumber 
    where RowNum = 1 
+0

ジョー、それは素晴らしい仕事。私はWITH句について知らなかったし、OVERやPARTITIONを使わなかったことがある。彼らが何をしているのか簡単に教えてもらえますか?私はそれらを探しましたが、今私は正しい情報を見つけることを確認します。 – RyanF

+0

@RyanF:WITH句は[Common Table ExpressionまたはCTE](http://msdn.microsoft.com/en-us/library/ms190766.aspx)を定義します。 [row_number](http://msdn.microsoft.com/en-us/library/ms186734.aspx)は[ウィンドウ関数](http://www.simple-talk.com/sql/learn-sql-server/working-with-window-functions-in-sql-server /)を参照してください。どちらもSQL Server 2005で導入された機能です。うまくいけば、これらのリンクを使用することで、正しい方向に着手することができます。 –

関連する問題