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 les colonnes 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 que Adm.Date et Dis.Date soient renseignés pour toutes les Ref.Date entre la plage de Adm.Date et Dis.Date et valeur manquante pour celles qui ne rentrent pas dans la plage de dates. J'ai pu obtenir l'Adm respectif. Date et Dis.Date utilisant la fonction if et lag uniquement pour l'enregistrement suivant 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 | Réf.Date | 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 | | | 10/1/2015 | | |
| 13 | 01/06/2016 | 25/1/2016 | 01/06/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 10/1/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 11/1/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 12/1/2016 | 01/06/2016 | 25/1/2016 |
Re : Récupérer des enregistrements entre deux plages de datesMerci pour la solution. Cela a parfaitement fonctionné.Re : Récupérer des enregistrements entre deux plages de datesVous pouvez gérer cela 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 : Récupérer des enregistrements entre deux plages de datesSalut Wilden,
Merci pour votre solution.
Je veux que Ref.Date soit dans la plage de dates respective pour cet identifiant 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 les valeurs d'ID 12. Idéalement, la date devrait être renseignée en fonction de l'ID et non en fonction des enregistrements Adm.Date et Dis.Date précédents disponibles. Je ne sais pas si ce script répondra à cette exigence. J'apprécie votre aide à cet égard. Merci.
Rini
| IDENTIFIANT | Adm. Date | Dis.Date | Réf.Date | 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 | | | 10/1/2015 | | |
| 13 | 01/06/2016 | 25/1/2016 | 01/06/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 10/1/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 11/1/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 12/1/2016 | 01/06/2016 | 25/1/2016 |
Re : Récupérer des enregistrements entre deux plages de datesVoici une solution qui a fonctionné sur votre scénario 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] = .
);
);