Para obtener registros entre dos intervalos de fechasHola,
Tengo la siguiente tabla de datos con las primeras 4 columnas como entrada y las últimas 2 como salida requerida. Traté de unir dos tablas para combinar la columna 1-3 y la columna 4 haciendo coincidir ID = ID y Adm.Date = Ref.Date. Ahora quiero dos columnas de salida ( Adm. Fecha_1 y Des_Fecha_1) Como se muestra abajo.Necesito Adm.Date y Dis.Date rellenados para todas las Ref.Date entre el rango de Adm.Date y Dis.Date y valor faltante para aquellos que no se ajustan al rango de fechas. Pude obtener el respectivo Adm. Date y Dis.Date usando la función if y lag solo para el siguiente registro y no para todos los registros en ese rango. Por favor, hágame saber si hay alguna manera de encontrar una solución adecuada a este problema.
Gracias de antemano.
| IDENTIFICACIÓN | Adm. Fecha | Fecha de cancelación | Ref. Fecha | Adm.Date_1 | Des.Fecha_1 |
| 12 | 12/02/2014 | 15/12/2014 | 12/02/2014 | 12/02/2014 | 15/12/2014 |
| 12 | | | 12/03/2014 | 12/02/2014 | 15/12/2014 |
| 12 | | | 12/06/2014 | 12/02/2014 | 15/12/2014 |
| 13 | | | 1/10/2015 | | |
| 13 | 01/06/2016 | 25/1/2016 | 01/06/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 1/10/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 1/11/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 1/12/2016 | 01/06/2016 | 25/1/2016 |
Re: Para obtener registros entre dos rangos de fechasGracias por la solución. Funcionó perfectamente.Re: Para obtener registros entre dos rangos de fechasPuede acomodar eso con bastante facilidad con algunos controles lógicos en la identificación:
dt = Current Data Table();
ad_date_temp = .;
dis_date_temp = .;
id_temp = :ID[1];
for(i=1,i<=N Row(dt), i++,
//Only update these vars if current row has new values for them
If(!Is Missing(:Name("Adm. Date")[i]),
//Execute if new Adm. Date
ad_date_temp = :Name("Adm. Date")[i];
dis_date_temp = :Name("Dis. Date")[i];
id_temp = :ID[i],
);
If(:Name("Ref.Date")[i] >= ad_date_temp & :Name("Ref.Date")[i] <= dis_date_temp & :ID[i] == id_temp,
//Execute if Ref Date is in the current range
:Name("Adm.Date_1")[i] = ad_date_temp;
:Name("Dis.Date_1")[i] = dis_date_temp
,
//Execute if Ref Date is not in the current range
:Name("Adm.Date_1")[i] = .;
:Name("Dis.Date_1")[i] = .
);
);Re: Para obtener registros entre dos rangos de fechasHola Wilden,
Gracias por tu solución.
Quiero que Ref.Date esté en el rango de fechas respectivo para esa identificación en particular. Digamos que para la fila 4 (ID 13), Ref.Date está entre Adm.Date y Dis.Date de ID 12, por lo que debería ser "." en lugar de tomar valores de ID 12. Idealmente, la fecha debe completarse en función de la identificación y no en el registro anterior Adm.Date y Dis.Date disponible. No estoy seguro de si este script se hará cargo de este requisito. Agradezco su ayuda en esto. Gracias.
Rini
| IDENTIFICACIÓN | Adm. Fecha | Fecha de cancelación | Ref. Fecha | Adm.Date_1 | Des.Fecha_1 |
| 12 | 12/02/2014 | 15/12/2014 | 12/02/2014 | 12/02/2014 | 15/12/2014 |
| 12 | | | 12/03/2014 | 12/02/2014 | 15/12/2014 |
| 12 | | | 12/06/2014 | 12/02/2014 | 15/12/2014 |
| 13 | | | 13/12/2014 | | |
| 13 | | | 1/10/2015 | | |
| 13 | 01/06/2016 | 25/1/2016 | 01/06/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 1/10/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 1/11/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 1/12/2016 | 01/06/2016 | 25/1/2016 |
Re: Para obtener registros entre dos rangos de fechasAquí hay una solución que funcionó en su caso de prueba al recorrer las filas de la tabla.Avíseme si necesita ayuda para entender el código.
dt = Current Data Table();
ad_date_temp = .;
dis_date_temp = .;
for(i=1,i<=N Row(dt), i++,
//Only update these vars if current row has new values for them
ad_date_temp = If(IsMissing(:Name("Adm. Date")[i]),ad_date_temp, :Name("Adm. Date")[i]);
dis_date_temp = If(IsMissing(:Name("Dis. Date")[i]),dis_date_temp, :Name("Dis. Date")[i]);
Show(i, ad_date_temp, dis_date_temp);
If(:Name("Ref.Date")[i] >= ad_date_temp & :Name("Ref.Date")[i] <= dis_date_temp,
//Execute if Ref Date is in the current range
:Name("Adm.Date_1")[i] = ad_date_temp;
:Name("Dis.Date_1")[i] = dis_date_temp
,
//Execute if Ref Date is not in the current range
:Name("Adm.Date_1")[i] = .;
:Name("Dis.Date_1")[i] = .
);
);