none
Como filtrar el menor valor de un campo agrupando por los distintos valores de otros campos RRS feed

  • Pregunta

  • Hola,

    Trabajo con SQL Server 2014 y tengo el siguiente problema.

    Tengo en mi base de datos una tabla llamada @data tal que:

    DECLARE @Data AS TABLE
    (
       IdActivo  Int ,
       Fecha Date,
       Hora time,
       Periodo Numeric (8,0)
     
    )
    
    ;
    INSERT INTO @Data
    VALUES(1,'01/01/2016','15:30:00',86400),
    (1,'01/01/2016','15:00:00',16200),
    (1,'01/01/2016','15:40:00',86400),
     (1,'01/01/2016','15:45:00',16200),
     (1,'01/01/2016','16:00:00',34800),
     (1,'01/01/2016','16:00:00',34800),
     (2,'01/01/2016','15:45:00',1500),
     (2,'01/01/2016','15:50:00',1200),
     (2,'02/01/2016','15:50:00',25000),
     (3,'01/01/2016','15:30:00',15000),
     (3,'01/01/2016','15:55:00',19000),
     (1,'02/01/2016','16:00:00',23400),
     (1,'02/01/2016','19:00:00',25500),
     (1,'02/01/2016','16:05:00',31580),
     (3,'03/01/2016','18:00:00',25000)
     
    ;


    Pues bien necesito eliminar todos aquellos registros agrupados por idactivo y fecha que tenga un valor del campo periodo mayor al más pequeño de todos los periodos para esa agrupación.

    Por ejemplo para el IdActivo 1 y Fecha 01/01/2016 nos quedariamos solo con los registros con periodo igual a 16200 que es el menor de todos los existentes para ese dia y ese activo (16200,34800,86400)

    Concretamente los valores que deberian quedarme de la tabla anterior serían:

    Para ello he empezado por intentar calcular un numero de orden para cada registro utilizando un partition by para despues eliminar todos aquellos registros con orden superior a uno.

    He probado:

    select distinct IdActivo,Fecha,Periodo,ROW_NUMBER() 
    
          OVER(PARTITION BY IdActivo,Periodo,Fecha ORDER BY Periodo ) as orden  from @Data

    Pero no consigo que el campo row number me arroje el valor que me sirva para ello.

    Alguna idea de qué puede estar ocurriendo? Cómo lo hariais vosotros?

    Muchas gracias

    Angel

    viernes, 6 de enero de 2017 21:43

Respuestas

  • Angeleci,

    Intenta realizar el siguiente cambio:

    WITH T AS (
        SELECT
    	   t1.IdActivo, t1.Fecha, t1.Hora, t1.Periodo,
    	   DENSE_RANK() OVER(PARTITION BY t1.IdActivo, t1.Fecha
    		  ORDER BY t1.Periodo) AS [F]
        FROM
    	   @Data t1
    )
    SELECT 
        t1.IdActivo, t1.Fecha, t1.Hora, t1.Periodo, t1.F
    FROM 
        T t1 
    WHERE 
        t1.F = 1; 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Angeleci viernes, 6 de enero de 2017 22:09
    viernes, 6 de enero de 2017 21:58
  • Hola,

    Intenta la funcion RANK:

    select distinct IdActivo,Fecha,Periodo  
    	 ,RANK() OVER(PARTITION BY IdActivo,Fecha ORDER BY Periodo ) as orden  
    from @Data

    • Marcado como respuesta Angeleci viernes, 6 de enero de 2017 22:09
    viernes, 6 de enero de 2017 21:53

Todas las respuestas

  • Hola,

    Intenta la funcion RANK:

    select distinct IdActivo,Fecha,Periodo  
    	 ,RANK() OVER(PARTITION BY IdActivo,Fecha ORDER BY Periodo ) as orden  
    from @Data

    • Marcado como respuesta Angeleci viernes, 6 de enero de 2017 22:09
    viernes, 6 de enero de 2017 21:53
  • Angeleci,

    Intenta realizar el siguiente cambio:

    WITH T AS (
        SELECT
    	   t1.IdActivo, t1.Fecha, t1.Hora, t1.Periodo,
    	   DENSE_RANK() OVER(PARTITION BY t1.IdActivo, t1.Fecha
    		  ORDER BY t1.Periodo) AS [F]
        FROM
    	   @Data t1
    )
    SELECT 
        t1.IdActivo, t1.Fecha, t1.Hora, t1.Periodo, t1.F
    FROM 
        T t1 
    WHERE 
        t1.F = 1; 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Angeleci viernes, 6 de enero de 2017 22:09
    viernes, 6 de enero de 2017 21:58
  • Muchas gracias a ambos
    viernes, 6 de enero de 2017 22:09