2011-01-20 28 views
12

Aradığım sonuçları elde edemiyorum diye bazı arama yaptım. Temel olarak şirketimizde dört farklı yönetim sistemimiz var ve her sistemden gelen verileri düzenli olarak bir araya getirme aşamasındayım. Amacım, verileri her saat başı bir merkezi veritabanına güncellemektir.Veritabanından her gruptaki son kaydı alma - 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 

Bu yüzden bu ana tabloyu sorgulamak ve yalnızca (LASTUPDATE göre) en son kayıt Ben bu sistemin ilgili en son bilgiler alabilirsiniz bu şekilde almak istiyorum: İşte ile çalışıyorum örnek bir veri kümesidir. Sorun şu ki, bir sistem her bir veritabanında olabilir, ancak elbette asla aynı kesin güncelleme zamanına sahip olmayacaklardır.

Böyle bir şey almak için beklenir:

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 

Ben MAX işlevini kullanarak denedi, ama bununla birlikte ben yalnızca bir sütun alabilir. Bunu bir alt sorguda kullanamıyorum çünkü bana en son güncellenmiş kaydı verecek benzersiz bir kimlik alanım yok. Sistemlerden biri bir MySQL veritabanıdır ve MySQL'deki MAX işlevi aslında GROUP BY başına bir kayıt döndürmek için ihtiyacım olan şekilde çalışacaktır, ancak SQL Server'da çalışmaz.

MAX ve bir SOL JOIN kullanmam gerektiğini düşünüyorum, ancak şimdiye kadar yaptığım girişimler başarısız oldu.

Yardımınız büyük memnuniyetle karşılanacaktır. Geçen 3-4 saat boyunca beynimi bir çalışma sorgusu almaya çalışıyorum. Bu ana tablo bir SQL Server 2005 sunucusunda bulunur.

Teşekkürler!

cevap

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

Joe, bu harika çalıştı. WITH WITH yan tümcesi hakkında hiç bir şey bilmedim ve daha önce hiç bir zaman da OVER veya PARTITION kullanmamıştım. Kısaca bana bunların neler yaptığını söyleyebilir misin? Onlara baktım, ama şimdi doğru bilgiyi bulacağına eminim. – RyanF

+0

@RyanF: ​​WITH yan tümcesi bir [Ortak Tablo İfadesi veya CTE] tanımlar (http://msdn.microsoft.com/en-us/library/ms190766.aspx). [row_number] (http://msdn.microsoft.com/en-us/library/ms186734.aspx) bir [window function] 'dir (http://www.simple-talk.com/sql/learn-sql-server/işçi ile pencere-fonksiyonları-in-sql sunucu /). Her ikisi de SQL Server 2005'te tanıtılan özelliklerdir. Umarım bu bağlantılar sizi doğru yönde başlatır. –