none
Cómo usar un Row Number Over Partition con una condición Where RRS feed

  • Pregunta

  • Hola, 

    Trabajo con SQL Server 2014 y tengo el siguiente problema.

    Dispongo de una tabla:

      DECLARE @Dias AS TABLE
    (
       Fecha date,
       Mes integer,
       orden  integer  
    );
    
    INSERT INTO @Dias
    VALUES('01/01/2017/',1,1),
     ('02/01/2017',1,2),
     ('03/01/2017',1,3),
     ('04/01/2017',1,1),
     ('05/01/2017',1,2),
     ('06/01/2017',1,3),
     ('07/01/2017',1,1),
     ('08/01/2017',1,2),
     ('09/01/2017',1,3),
     ('10/01/2017',1,1),
     ('11/01/2017',1,2),
     ('12/01/2017',1,3),
     ('01/02/2017/',2,1),
     ('02/02/2017',2,2),
     ('03/02/2017',2,3),
     ('04/02/2017',2,1),
     ('05/02/2017',2,2),
     ('06/02/2017',2,3),
     ('07/02/2017',2,1),
     ('08/02/2017',2,2),
     ('09/02/2017',2,3),
     ('10/02/2017',2,1),
     ('11/02/2017',2,2),
     ('12/02/2017',2,3)

    Necesito crear un campo-Dia Liquidación-  que me indique si un registro me ofrece un valor del campo orden igual a 3 por tercera mes dentro de un mismo mes (campo Mes). En caso afirmativo el campo Dia Liquidación será igual a 1, de no serlo será igual a 0.

    Os dejo la tabla que obtendría.


    Sé que se debe usar la clausula row_number pero en este caso entiendo que necesito aplicar un where para que haga el conteo de sólo las veces anterior en que orden fue igual a 3. 

    He probado con hacer una tabla temporal con los dias en que orden=3 y despues hacer un IF Exists a dicha tabla. El problema es que el rendimiento cae muchísimo llegando a colgarse el proceso en ocasiones.

    ¿Tenéis alguna idea de cómo podría resolverse?

    Muchas gracias

    Un saludo


    Angel


    • Editado Angeleci martes, 1 de mayo de 2018 8:48
    martes, 1 de mayo de 2018 8:47

Respuestas

  • Para ser un poco más precisos y con el equipo delante, puede ser así.

      
        SELECT  CONVERT(VARCHAR(10), D.Fecha, 103) AS Fecha,
               d.Mes as Mes,
               d.orden as orden,
               CASE WHEN (ROW_NUMBER() OVER(PARTITION BY d.mes,
                                              d.orden ORDER BY D.FECHA)) = 3 AND D.ORDEN = 3 THEN 1 ELSE 0 
    										   END AS "Día Liquidación"
        FROM @Dias d
    	ORDER BY Mes, Fecha
    Un saludo

    • Marcado como respuesta Angeleci martes, 1 de mayo de 2018 21:12
    martes, 1 de mayo de 2018 17:21

Todas las respuestas

  • Hola:

    Puede ser así:

    SELECT o.Fecha,
           o.mes,
           o.orden,
           o.diasliquidacion
    FROM
    (
        SELECT d.Fecha,
               d.Mes,
               d.orden,
               ROW_NUMBER() OVER(PARTITION BY d.mes,
                                              d.orden ORDER BY d.mes,
                                                               d.orden) AS diasliquidacion
        FROM @Dias d
        WHERE d.orden = 3
    ) AS o
    WHERE o.diasliquidacion = 3;
    

    Un saludo

    martes, 1 de mayo de 2018 9:20
  • Hola Javi.

    Gracias por tu respuesta.

    Con el script que me sugieres obtengo lo siguiente:

    En mi caso necesitaría obtener la tabla de esta forma, es decir, aunar en una tabla todas las fechas de la tabla de partida @Dias pero indicando con el nuevo campo Dia Liquidación si cada registro es la tercera vez en el mes que tiene el valor 3. Sería así:

    martes, 1 de mayo de 2018 10:36
  • Hola

    Quita el where y sobre la columna diasliquidacion haz un case when....=3 then 1 else 0 end as diasliq...

    Un saludo

    martes, 1 de mayo de 2018 11:27
  • Para ser un poco más precisos y con el equipo delante, puede ser así.

      
        SELECT  CONVERT(VARCHAR(10), D.Fecha, 103) AS Fecha,
               d.Mes as Mes,
               d.orden as orden,
               CASE WHEN (ROW_NUMBER() OVER(PARTITION BY d.mes,
                                              d.orden ORDER BY D.FECHA)) = 3 AND D.ORDEN = 3 THEN 1 ELSE 0 
    										   END AS "Día Liquidación"
        FROM @Dias d
    	ORDER BY Mes, Fecha
    Un saludo

    • Marcado como respuesta Angeleci martes, 1 de mayo de 2018 21:12
    martes, 1 de mayo de 2018 17:21
  • Muchas gracias Javi.

    Me ha servido correctamente.

    martes, 1 de mayo de 2018 21:12