Ragazzi, ho una query in cui selezionare fondamentalmente l'ultimo browser utilizzato dal nostro utente.Selezionare quello in alto dall'uniforme esterno sinistro
qui è la nostra struttura (semplificato) tavolo
HITS_TABLE
----------
USERID
BROWSER
HITSDATE
USER_TABLE
----------
USERID
USERNAME
e ecco come lo interrogo l'ultima versione del browser che il nostro utente ha utilizzato
SELECT U.*, H.BROWSER
FROM USER_TABLE U
CROSS APPLY
(SELECT TOP 1 BROWSER
FROM HITS_TABLE
WHERE HITS_TABLE.USERID = U.USERID
ORDER BY HITS_TABLE.HITSDATE DESC
)as H
Il HITS_TABLE è appena aggiunto alcuni giorni fa.
Quindi, questa query è solo gli utenti che hanno avuto esito positivo visitando il nostro sito Web dopo aver aggiunto HITS_TABLE ed eliminato gli altri.
Qui è il caso del campione
USER_TABLE
-------------------
USERID USERNAME
-------------------
1 'Spolski'
2 'Atwoord
3 'Dixon'
HITS_TABLE
------------------------------
USERID HITSDATE BROWSER
------------------------------
2 15/8/2009 'Firefox 3.5'
1 16/8/2009 'IE 6'
2 16/8/2009 'Chrome'
Ecco il risultato del campione
------------------------------
USERID USERNAME BROWSER
------------------------------
1 'Spolsky' 'IE 6'
2 'Atwoord' 'Chrome'
Ma, voglio aggiungere altri utenti con il browser 'sconosciuto'. Ecco il mio risultato desiderato
------------------------------
USERID USERNAME BROWSER
------------------------------
1 'Spolsky' 'IE 6'
2 'Atwoord' 'Chrome'
3 'Dixon' 'Unknown'
Ritengo che possa essere raggiunto con LEFT OUTER JOIN. Ma ho sempre avuto questa: (non voglio che questo risultato)
------------------------------
USERID USERNAME BROWSER
------------------------------
1 'Spolsky' 'IE 6'
2 'Atwoord' 'Chrome'
2 'Atwoord' 'Firefox 3.5'
3 'Dixon' 'Unknown'
Spero che la mia domanda è chiara.
Questa soluzione tiene conto di un fatto importante, che mancano gli altri: cosa succede se la combinazione di USERID e HITSDATE è ambigua, ad es. esiste una riga aggiuntiva (2, 16/8/2009, 'Safari')? Usando le funzioni di classifica otterresti un risultato non deterministico. Puoi dire quale è selezionato? Questa soluzione fornirebbe entrambe le iniziazioni che è IMHO molto meglio. –
Ulteriori informazioni: per informazioni su SQL Server Ranking vedere http://msdn.microsoft.com/en-us/library/ms189798%28SQL.90%29.aspx –
hai ragione. la funzione max() è molto utile per questo. grazie. ma penso che dovrebbe essere lasciato esterno join. –