Pour récupérer des enregistrements entre deux plages de datesSalut,
J'ai le tableau de données suivant avec les 4 premières colonnes étant l'entrée et les 2 dernières étant la sortie requise. J'ai essayé de joindre deux tables pour combiner la colonne 1-3 et la colonne 4 en faisant correspondre ID = ID et Adm.Date = Ref.Date. Maintenant, je veux deux colonnes de sortie ( Adm. Date_1 et Dis_Date_1) comme indiqué ci-dessous.J'ai besoin de Adm.Date et Dis.Date remplis pour tous les Ref.Date entre la plage de Adm.Date et Dis.Date et valeur manquante pour ceux qui ne rentrent pas dans la plage de dates. J'ai pu obtenir Adm respectif. Date et Dis.Date en utilisant la fonction if et lag uniquement pour l'enregistrement suivant et non pour tous les enregistrements de cette plage. S'il vous plaît laissez-moi savoir s'il existe un moyen de trouver une solution appropriée à ce problème.
Merci d'avance.
| IDENTIFIANT | Adm. Date | Dis.Date | Date de réf. | Adm.Date_1 | Dis.Date_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 | | | 01/10/2015 | | |
| 13 | 01/06/2016 | 25/1/2016 | 01/06/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 01/10/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 01/11/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 01/12/2016 | 01/06/2016 | 25/1/2016 |
Re : Pour récupérer des enregistrements entre deux plages de datesMerci pour la solution. Cela a parfaitement fonctionné.Re : Pour récupérer des enregistrements entre deux plages de datesVous pouvez vous en occuper assez facilement avec quelques vérifications logiques de l'identité :
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 : Pour récupérer des enregistrements entre deux plages de datesSalut Wilden,
Merci pour votre solution.
Je veux que la Ref.Date soit dans la plage de dates respective pour cet ID particulier. Disons que pour la ligne 4 (ID 13), Ref.Date est entre Adm.Date et Dis.Date de l'ID 12, il devrait donc être "." au lieu de prendre des valeurs d'ID 12. Idéalement, la date doit être renseignée en fonction de l'ID et non de l'enregistrement Adm.Date et Dis.Date précédent disponible. Je ne sais pas si ce script prendra soin de cette exigence. Appréciez votre aide dans ce domaine. Merci.
Rini
| IDENTIFIANT | Adm. Date | Dis.Date | Date de réf. | Adm.Date_1 | Dis.Date_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 | | | 01/10/2015 | | |
| 13 | 01/06/2016 | 25/1/2016 | 01/06/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 01/10/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 01/11/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 01/12/2016 | 01/06/2016 | 25/1/2016 |
Re : Pour récupérer des enregistrements entre deux plages de datesVoici une solution qui a fonctionné sur votre cas de test en parcourant les lignes du tableau.Faites-moi savoir si vous avez besoin d'aide pour comprendre le code.
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] = .
);
);