sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo consultar las clasificaciones de los usuarios en mi base de datos, pero solo considerar la última entrada para cada usuario?

Esto es lo que yo llamo el problema del "mayor n-por-grupo". Aparece varias veces por semana en StackOverflow.

Resuelvo este tipo de problema usando una técnica de unión 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;

Esto devolverá solo una fila para cada nombre de usuario:la fila con el mayor valor en ScrapeDate columna. Para eso está la combinación externa, para probar para coincidir con s1 con alguna otra fila s2 con el mismo nombre de usuario y una fecha mayor. Si no existe tal fila, la combinación externa devuelve NULL para todas las columnas de s2 , y luego conocemos s1 corresponde a la fila con la mayor fecha para ese nombre de usuario dado.

Esto también debería funcionar cuando tiene un raspado parcialmente completado en progreso.

Esta técnica no es necesariamente tan rápida como las soluciones CTE y RANKING que han dado otras respuestas. Deberías probar ambos y ver qué funciona mejor para ti. La razón por la que prefiero mi solución es que funciona en cualquier versión de SQL.