Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso consultar as classificações dos usuários no meu banco de dados, mas considerar apenas a entrada mais recente de cada usuário?


Isso é o que eu chamo de problema do "maior n-por-grupo". Ele aparece várias vezes por semana no StackOverflow.

Eu resolvo esse tipo de problema usando uma técnica de junção externa:
SELECT s1.*, s1.wins / s1.losses AS win_loss_ratio
FROM Scrape s1
LEFT OUTER JOIN Scrape s2
  ON (s1.username = s2.username AND s1.ScrapeDate < s2.ScrapeDate)
WHERE s2.username IS NULL
ORDER BY win_loss_ratio DESC;

Isso retornará apenas uma linha para cada nome de usuário -- a linha com o maior valor no ScrapeDate coluna. É para isso que serve a junção externa, para tentar para corresponder a s1 com alguma outra linha s2 com o mesmo nome de usuário e uma data maior. Se não houver tal linha, a junção externa retornará NULL para todas as colunas de s2 , e então sabemos s1 corresponde à linha com a maior data para esse nome de usuário.

Isso também deve funcionar quando você tiver uma raspagem parcialmente concluída em andamento.

Essa técnica não é necessariamente tão rápida quanto as soluções CTE e RANKING que outras respostas deram. Você deve experimentar os dois e ver o que funciona melhor para você. A razão pela qual prefiro minha solução é que ela funciona em qualquer tipo de SQL.