Tengo una tabla de usuarios:
|Username|UserType|Points|
|John |A |250 |
|Mary |A |150 |
|Anna |B |600 |
y niveles
|UserType|MinPoints|Level |
|A |100 |Bronze |
|A |200 |Silver |
|A |300 |Gold |
|B |500 |Bronze |
Y estoy buscando una consulta para obtener el nivel para cada usuario. Algo en la línea de:
SELECT *
FROM Users U
INNER JOIN (
SELECT TOP 1 Level, U.UserName
FROM Levels L
WHERE L.MinPoints < U.Points
ORDER BY MinPoints DESC
) UL ON U.Username = UL.Username
Tal que los resultados serían:
|Username|UserType|Points|Level |
|John |A |250 |Silver |
|Mary |A |150 |Bronze |
|Anna |B |600 |Bronze |
¿Alguien tiene alguna idea o sugerencia sobre cómo podría hacer esto sin recurrir a los cursores?
fuente
INCLUDE
)? Además, ¿tienes un índiceUsers (UserType, Points)
? (podría ayudar)Users
) hay y qué ancho tiene esa tabla?¿Por qué no hacerlo utilizando solo las operaciones rudimentarias, INNER JOIN, GROUP BY y MAX:
fuente
Creo que puede usar un
INNER JOIN
-como un problema de rendimiento que también puede usar en suLEFT JOIN
lugar- conROW_NUMBER()
funciones como esta:Demostración de violín de SQL
fuente