none
SELECCIÓN DE VALORES MAS ALTOS PARA UNA DETERMINADA CATEGORÍA RRS feed

  • Pregunta

  • Como puedo seleccionar de una tabla los valores más altos pero de una determinada categoría?, quiero seleccionar 7 datos de cada categoría de 30 (un mes) que se tienen por categoría. y tengo más de 200 categorías diferentes. Al usar TOP n no veo como diferenciar las categorías. Gracias !
    lunes, 8 de octubre de 2018 13:38

Respuestas

  • Efectivamente falta mejor descripción aqui ( y la version de Sql que usas) para una consulta de Top N por categoria puedes guiarte con este ejemplo:

    SELECT Categoria,Dia, Monto
    FROM (
        SELECT Categoria,Dia, Monto, ROW_NUMBER() 
          OVER (Partition BY Categoria
                ORDER BY Monto DESC ) AS Rank
        FROM MiTabla
        ) mt  WHERE Rank <= 7

    Saludos

    Anibal Marcano

    lunes, 8 de octubre de 2018 15:14
  • Hola RalphMora:

    Yo diría que te han dado la respuesta correcta, o casi.

    CREATE TABLE miTablaCategorias
    (categoria VARCHAR(10),
     dia       INT
    );
    GO
    DECLARE @num INT= 1;
    DECLARE @i INT= 4;
    WHILE(@i > 0)
        BEGIN
            WHILE(@num < 30)
                BEGIN
                    INSERT INTO miTablaCategorias
    (categoria,
     dia
    )
                    VALUES
    ('categ '+CAST(@i AS VARCHAR(1)),
     @num
    );
                    SET @num = @num + 1;
                END;
            SET @i = @i - 1;
            SET @num = 1;
        END;
    GO
    SELECT o.categoria, o.dia
    FROM
    (
        SELECT ROW_NUMBER() OVER(PARTITION BY categoria ORDER BY dia) AS fila,
               dia,
               categoria
        FROM miTablaCategorias
    ) AS o
    WHERE o.fila < 8;
    
    
    

    Fíjate que te hago una tabla con dos campos, categoria y dia. lleno 4 categorias, y 30 valores para cada uno.

    Y la consulta es una numeración de registros (row_number() empezando de nuevo cada vez que se cambie la categoria, ordenado por el dia. Esto esta en una tabla derivada, que extraes en la select.

    Espero te ayude.

    Si no es correcto, porque no pegas unas cuantas filas, ilustrativas de lo que tienes, y lo que quieres, y seguro que podemos echarte un cable.

    miércoles, 10 de octubre de 2018 20:18

Todas las respuestas

  • Cuando dices "7 datos" te refieres a 7 columnas???, necesitas dar un poco mas de información, como la consulta que estas haciendo, los resultados que estas obteniendo y los resultados deseados.

    Con la información que das lo que te puedo recomendar es que uses GROUP BY y usas categoría como columna de agrupación, así en tu consulta podrás incluir la columna categoría y tu resultado estará agrupado por ella.

    lunes, 8 de octubre de 2018 13:46
  • Efectivamente falta mejor descripción aqui ( y la version de Sql que usas) para una consulta de Top N por categoria puedes guiarte con este ejemplo:

    SELECT Categoria,Dia, Monto
    FROM (
        SELECT Categoria,Dia, Monto, ROW_NUMBER() 
          OVER (Partition BY Categoria
                ORDER BY Monto DESC ) AS Rank
        FROM MiTabla
        ) mt  WHERE Rank <= 7

    Saludos

    Anibal Marcano

    lunes, 8 de octubre de 2018 15:14
  • Gracias por el interés. Cuando me refiero a 7 datos me refiero a filas. La estructura de la tabla en términos generales es una categoría y 30 valores por categoría, y quiero obtener solo los 7 para cada una de las categorías. Espero haber aclarado la pregunta.
    miércoles, 10 de octubre de 2018 15:59
  • Hola RalphMora:

    Yo diría que te han dado la respuesta correcta, o casi.

    CREATE TABLE miTablaCategorias
    (categoria VARCHAR(10),
     dia       INT
    );
    GO
    DECLARE @num INT= 1;
    DECLARE @i INT= 4;
    WHILE(@i > 0)
        BEGIN
            WHILE(@num < 30)
                BEGIN
                    INSERT INTO miTablaCategorias
    (categoria,
     dia
    )
                    VALUES
    ('categ '+CAST(@i AS VARCHAR(1)),
     @num
    );
                    SET @num = @num + 1;
                END;
            SET @i = @i - 1;
            SET @num = 1;
        END;
    GO
    SELECT o.categoria, o.dia
    FROM
    (
        SELECT ROW_NUMBER() OVER(PARTITION BY categoria ORDER BY dia) AS fila,
               dia,
               categoria
        FROM miTablaCategorias
    ) AS o
    WHERE o.fila < 8;
    
    
    

    Fíjate que te hago una tabla con dos campos, categoria y dia. lleno 4 categorias, y 30 valores para cada uno.

    Y la consulta es una numeración de registros (row_number() empezando de nuevo cada vez que se cambie la categoria, ordenado por el dia. Esto esta en una tabla derivada, que extraes en la select.

    Espero te ayude.

    Si no es correcto, porque no pegas unas cuantas filas, ilustrativas de lo que tienes, y lo que quieres, y seguro que podemos echarte un cable.

    miércoles, 10 de octubre de 2018 20:18
  • Se me olvidaba, el order by de la numeración de filas, es el que te permite los más altos o bajos.
    miércoles, 10 de octubre de 2018 20:18