SQL Server - Seleccionar Top Rows de Grupos de datos
Finalmente encontre una solución estable acerca de como obtener un "Top 10" de varios sub-grupos.
Lo que quiero dar a entender es que podemos agrupar varios registros de un mismo valor, pero en otras columnas tenemos valores diferentes por lo cual no podemos agruparlos y saldrían todos esos renglones, pero que pasa si además de ese sub-grupo solo quiero tener tan solo los primeros 3 o mas registros.
Bueno, deja explíco gráficamente
Tenemos la siguiente tabla
Name | Value | |
Anna | Warrior1 | |
Anna | Warrior2 | |
Anna | Warrior3 | |
Anna | Warrior4 |
Del cual solo quiero tener los primeros 3 valores, ¿y como puedo hacer yo esto?
Para empezar pues tendría que agrupar con respeto a la columna "Name" y despues ennumerar los Rows resultantes para después aplicar un filtro sobre esta enumeración como por ejemplo un "Between"
Aquí adjunto el código de prueba
DECLARE @t TABLE (
nombre VARCHAR(50)
,tipo VARCHAR(10)
)
INSERT INTO @t(nombre, tipo) VALUES ('Ana', 'Warrior')
INSERT INTO @t(nombre, tipo) VALUES (
'Ana'
, 'Warrior1')
INSERT INTO @t(nombre, tipo) VALUES (
'Ana'
, 'Warrior2')
INSERT INTO @t(nombre, tipo) VALUES (
'Ana'
, 'Warrior3')
INSERT INTO @t(nombre, tipo) VALUES (
'Ana'
, 'Warrior4')
INSERT INTO @t(nombre, tipo) VALUES ('Rock', 'Warrior1')
INSERT INTO @t(nombre, tipo) VALUES ('Rock', 'Warrior2')
INSERT INTO @t(nombre, tipo) VALUES ('Rock', 'Warrior3')
INSERT INTO @t(nombre, tipo) VALUES ('Consul', 'Warrior')
INSERT INTO @t(nombre, tipo) VALUES ('Miracle', 'Warrior')
--La magia empieza aquí
SELECT nombre, tipo, otro FROM
(
SELECT nombre
,tipo
,RANK() OVER(PARTITION BY nombre ORDER BY nombre, tipo) AS otro
FROM
(
SELECT nombre, tipo
FROM @t
GROUP BY nombre, tipo
) o
) f
WHERE otro BETWEEN 1 and 2
Dentro del Between nosotros podemos limitar el Top de los renglones a seleccionar
Espero les haya gustado este script y les sea de utilidad, saludos
Comentarios
Publicar un comentario