2011-01-20 12 views
12

Ho fatto un po 'di ricerca non riesco a ottenere i risultati che sto cercando. Fondamentalmente abbiamo quattro diversi sistemi di gestione in atto in tutta la nostra azienda e sono in procinto di combinare tutti i dati di ciascun sistema su base regolare. Il mio obiettivo è aggiornare i dati ogni ora in un database centrale. Ecco una serie di dati di esempio sto lavorando con:Recupero dell'ultimo record in ogni gruppo dal database - 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 

quindi voglio interrogare questa tabella principale e recuperare solo l'ultimo disco (sulla base di LASTUPDATE) in questo modo posso ottenere le ultime informazioni su quel sistema. Il problema è che un sistema può trovarsi in ogni database, ma ovviamente non avranno mai lo stesso esatto tempo di aggiornamento.

mi aspetto di ottenere qualcosa del genere:

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 

Ho provato con la funzione MAX, ma con che posso recuperare solo una colonna. E non posso usarlo in una sottoquery perché non ho un campo ID univoco che mi dia l'ultimo record aggiornato. Uno dei sistemi è un database MySQL e la funzione MAX in MySQL funzionerà nel modo in cui mi serve per restituire solo un record per GROUP BY, ma non funziona in SQL Server.

Sto pensando che ho bisogno di usare MAX e un SINISTRO SINISTRO, ma i miei tentativi finora hanno fallito.

Il vostro aiuto sarebbe molto apprezzato. Ho tormentato il mio cervello nelle ultime 3-4 ore cercando di ottenere una query di lavoro. Questa tabella principale si trova su un server SQL Server 2005.

Grazie!

risposta

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, ha funzionato benissimo. Non ho mai saputo della clausola WITH e non ho mai usato OVER o PARTITION prima. Puoi brevemente dirmi cosa stanno facendo. Li ho cercati, ma ora sono sicuro di trovare le informazioni corrette. – RyanF

+0

@RyanF: ​​la clausola WITH definisce una [Common Table Expression o CTE] (http://msdn.microsoft.com/en-us/library/ms190766.aspx). [numero_riga] (http://msdn.microsoft.com/en-us/library/ms186734.aspx) è una [funzione finestra] (http://www.simple-talk.com/sql/learn-sql-server/lavoro-con-window-funzioni-in-sql server /). Entrambe sono funzionalità introdotte in SQL Server 2005. Speriamo che questi collegamenti possano iniziare nella giusta direzione. –

Problemi correlati