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

Entradas populares de este blog

SQL Server - Obtener y listar archivos de una ruta especifica

SQL Server - How to fix orphan users

Linked Server a Postgres