Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Repetir datos en el Intervalo

Hola,

Tengo un problema que no he podido resolver. Tengo una tabla de datos que nececito llenar con los datos faltantes

Esta es una parte de la tabla

Empleado          Fecha

15001               01/06/2005

18887               26/04/2006

18887               02/02/2014

27305               10/08/2008

27305               13/03/2013

27305               01/04/2014

Lo que necesito crear, es el intervalo de fechas con el dato que les corresponde, a partir de la fecha inicial:

Ejemplo resultado:

Empleado       Fecha

15001             01/06/2005

15001             02/06/2005

15001             03/06/2005

15001             ...hasta el día de hoy..

18887            26/04/2006

18887            27/04/2006

18887            28/04/2006

18887            29/04/2006

18887           ......hasta el día de la siguiente fecha...

18887            02/02/2014

18887            03/02/2014

18887            04/02/2014

18887           ...hasta el día de hoy..

27305           10/08/2008

27305            11/08/2008

27305            12/08/2008

27305          ......hasta el día de la siguiente fecha...

27305            13/03/2013

27305            14/03/2013

27305            15/03/2013

27305           ......hasta el día de la siguiente fecha...

27305           01/04/2015

27305           02/04/2015

27305           ...hasta el día de hoy..


Llevo varíos dias intentando resolverlo,pero ya se me agotaron las opciones .

Ojala alguien me pueda orientar .

Saludos.

1 Solution

Accepted Solutions
Anonymous
Not applicable
Author

Hola,

Estaba haciendo pruebas con el script que escribiste, no me queda claro como funciona esta línea,

Load Date(MinFecha + IterNo() -1 ) AS Fecha While (MinFecha + IterNo() - 1) <= Num(MaxFecha);

Sin embargo el resultado es perfecto, es justo lo que buscaba.

Te agradezco las atenciones, era un problema que me tenia de cabeza hace unos días.

Saludos y gracias nuevamente.

View solution in original post

9 Replies
sorrakis01
Specialist
Specialist

Hola Ricardo,

Mirate este ejemplo si es lo que necesitas, Revísalo y mira si lo puedes pulir


Saludos,

jolivares
Specialist
Specialist

Segun puedo ver, lo que tendrias que hacer es tomar la primera fecha y generar el QVD hasta la fecha de hoy? si es asi entonces aqui tiene algo que te sirve.

T1:

LOAD * INLINE [

    Empleado, Fecha

    15001, 01/06/2005

    18887, 26/04/2006

    18887, 02/02/2014

    27305, 10/08/2008

    27305, 13/03/2013

    27305, 01/04/2014

];

T2:

NoConcatenate

Load Empleado, Min(Fecha) as Fecha

Resident T1 Group By Empleado;

T3:

Load Empleado, Date(Fecha+IterNo()-1) as Fechas

Resident T2

While IterNo()<= Today()-Fecha+1;

DROP Table T1,T2;

Anonymous
Not applicable
Author

Hola, tienes razón se tiene que repetir hasta hoy. La dificultad con la que me encontré es que el mismo empleado puede tener un cambio de fecha. Lo que acabo de notar en que en mi ejemplo hace falta una fecha de Ingreso           

Por ejemplo: La fecha de ingreso es el 13/03/2013, y se debe repetir el intervalo hasta su siguiente fecha 01/04/2015, y esta última es la que se debe repetir al día de hoy.

Cuando

Empleado          Fecha                                                Fecha Ingreso

27305            13/03/2013                                            13/03/2013

27305            14/03/2013                                            13/03/2013

27305            15/03/2013                                            13/03/2013

27305           ......hasta el día de la siguiente fecha...  13/03/2013

27305           01/04/2015                                              01/04/2015

27305           02/04/2015                                              01/04/2015

27305           ...hasta el día de hoy..                             01/04/2015

Lo intente con la alternativa que me diste, sin embrago mi calendario terminó con algo así:

Empleado          Fecha              Fecha Ingreso

27305            28/06/2016            13/03/2013

27305            28/06/2016            01/04/2015

27305            29/06/2016            13/03/2013

27305            29/06/2016            01/04/2015

Saludos y gracias por el tiempo dedicado.

Anonymous
Not applicable
Author

Hola Jordi,

Ya vi el script y parece funcionar muy bien. Solo que no coloque el ejemplo completo

Lo que acabo de notar en que en mi ejemplo hace falta una fecha de Ingreso           

Por ejemplo: La fecha de ingreso es el 13/03/2013, y se debe repetir el intervalo hasta su siguiente fecha 01/04/2015, y esta última es la que se debe repetir al día de hoy.

Este es el ejemplo con el empleado 27305.

Empleado          Fecha                                                Fecha Ingreso

27305            13/03/2013                                            13/03/2013

27305            14/03/2013                                            13/03/2013

27305            15/03/2013                                            13/03/2013

27305           ......hasta el día de la siguiente fecha...  13/03/2013

27305           01/04/2015                                              01/04/2015

27305           02/04/2015                                              01/04/2015

27305           ...hasta el día de hoy..                             01/04/2015

Ojala puedas ayudarme

rubenmarin

Hola Ricardo, supongo que se podrá optimizar porque he ido directo a por la solución, mira si este script te valdría:

Orig:

LOAD Empleado, Date#(Fecha, 'DD/MM/YYYY') as Fecha Inline [

Empleado ,Fecha

15001 ,01/06/2005

18887 ,26/04/2006

18887 ,02/02/2014

27305 ,10/08/2008

27305 ,13/03/2013

27305 ,01/04/2014

];

Data:

LOAD Empleado,

  Fecha as [Fecha Inicio],

  If(Peek('Empleado')=Empleado, Date(Peek([Fecha Inicio])-1), Date(Today())) as [Fecha Fin]

Resident Orig Order By Empleado asc, Fecha desc;

Calendario:

LOAD Date(Fecha) AS Fecha;

LOAD Date(MinFecha + IterNo() -1 ) AS Fecha While (MinFecha + IterNo() - 1) <= Num(MaxFecha);

LOAD Min(Fecha) as MinFecha, Today() as MaxFecha Resident Orig;

Left Join (Calendario)LOAD * Resident Data;

EndData:

NoConcatenate LOAD * Resident Calendario Where [Fecha Inicio]<=Fecha and [Fecha Fin]>=Fecha;

DROP Tables Data, Calendario, Orig;

sorrakis01
Specialist
Specialist

Hola,

Intenta crear una tabla tipo mapping con las fechas de ingreso, luego cargas ese mapping en la tabla final en un campo llamado fecha ingreso te quedaran registros en con el campo fecha ingreso en blanco... para que tengan valor haz un peek del valor anterior...

Creo que te tendría que funcionar.

Saludos,

Anonymous
Not applicable
Author

Hola,

Estaba haciendo pruebas con el script que escribiste, no me queda claro como funciona esta línea,

Load Date(MinFecha + IterNo() -1 ) AS Fecha While (MinFecha + IterNo() - 1) <= Num(MaxFecha);

Sin embargo el resultado es perfecto, es justo lo que buscaba.

Te agradezco las atenciones, era un problema que me tenia de cabeza hace unos días.

Saludos y gracias nuevamente.

Anonymous
Not applicable
Author

Hola Jordi,

Lo que mencionas funcionó bien, no conocía la funcionalidad de Peek, en el script que escribió Ruben Marin pude ver la funcionalidad, y se basa en tener orden en los datos.

Gracias por las atenciones.

rubenmarin

Hola Ricardo, esa sentencia genera todas las fechas entre MinFecha y MaxFecha, tiene como origen la línea inferior: carga la fecha más baja como MinFecha y la fecha de hoy como MaxFecha.

Con esos datos hace un bucle que va desde MinFecha hasta MaxFecha (Esta es la parte del while)

El IterNo() recupera el número de iteración del bucle, empezando por 1 (por eso se resta 1), por lo que:

- La primera iteración genera la fecha MinFecha+0

- La 2ª iteración crea MinFecha+1

- Y así hasta llegar a MaxFecha,

Por aclararlo, las fechas son números enteros (la hora son los decimales), por ejemplo hoy (01/07/2016) es la fecha 42552, ayer era la 42551, por eso sumando 1 se van generando todas las fechas.

El LOAD de arriba realmente no sería necesario si solo se carga la fecha, se me quedó por costumbre , en esa parte se suelen generar los campos relacionados con la fecha: Mes, Semana, AñoMes, flags...

Saludos.