TOPs de distintos valores en SQL ¿es posible?

Sí, por casualidades de la vida, voy y me encuentro esta cuestión hace unos días encima de la mesa. El objetivo es claro: de lo obtenido en una consulta más o menos compleja, tengo que listar los "x" primeros resultados según cierto criterio y según un campo resultado de dicha consulta ... pero también los "x" primeros de los distintos valores de esos resultados. Parece un lío, ¿no?. Pero con este ejemplo veréis lo sencillo que es. Si es que no hay nada como la simplicidad, y más con las Bases de Datos, jejeje. Así que antes de ponerte a hacer algún que otro cursor, función o procedimiento almacenado estudia bien el ejemplo y seguro te será de utilidad algún día (esa es mi intención). Cuando te bajes el ejemplo (como todos a partir de ahora), ábrelo con el bloc de notas de Windows por ejemplo, y copia y pega el contenido en una pestaña (Nueva consulta) en el SQL Server Management Studio (SMSS). Pulsa F5 para ejecutar la consulta (o pulsa sobre el botón correspondiente). El script generará unas tablas temporales de ejemplo, insertará unos pocos registros, ejecutará la consulta (select)  que recomiendo "estudiar" y por último borrará las tablas. La base es la instrucción:

ROW_NUMBER() OVER (PARTITION BY campo1 ORDER BY campo2 desc) AS indice

Con ello conseguimos "dividir" el listado según los valores de campo1 y ordenarlos según los valores de campo2. A continuación basta con filtrar el listado final con un indice<=num_registros_top para obtener en una única y simple consulta los top "num_registros_top" de cada campo1 (en el ejemplo se muestran, para cada artículo, los TOP 2 países donde más se ha vendido dicho artículo). Fácilmente podemos incluir el resultado como subconsulta de otra similar y obtener los Tops de los Tops, etc. Nos vemos.

No hay comentarios :

Publicar un comentario

Buscar en el Blog: