Correspondance exacte et correspondance la plus proche pour mettre à jour une table avec une autre tableJ'ai une table Big Data (1 million de lignes).Une colonne est SerialNumber, une colonne est dateTime, une colonne est elapsedTime.Un autre tableau beaucoup plus petit contient également ces colonnes, mais le dateTime est légèrement antérieur (5 à 20 minutes) et le elapsedTime est une valeur beaucoup plus précise.La petite table contient également de nombreuses lignes supplémentaires associées à d'autres événements à d'autres dates et heures (je n'ai pas de colonne « événement »).Je souhaite mettre à jour la grande table avec les temps écoulés précis en faisant correspondre les numéros de série et en sélectionnant le plus grand dateTime inférieur ou égal au dateTime de la grande table.
Cela fera partie d'un script plus vaste exécuté quotidiennement, mettant à jour chaque numéro de série chaque jour.
À l'heure actuelle, ma meilleure solution consiste à faire des compromis sur la précision et à sélectionner simplement le temps écoulé moyen pour toute la journée, ainsi qu'à utiliser une correspondance exacte pour la colonne dateTime.Cela introduira une inexactitude lorsque la petite table comprend plusieurs événements à plusieurs moments d'une journée donnée, mais "dans les 12 heures" est toujours beaucoup plus précis que la grande table ne l'est actuellement.
Il existe une autre solution utilisant une paire de boucles foreachrows imbriquées, mais cela sera très lent.
Si vous avez une idée, suggérez-la simplement, ne vous inquiétez pas (encore) d'écrire le code.
Merci,
Jonathan
Re : Correspondance exacte et correspondance la plus proche pour mettre à jour une table avec une autre tableC’est une méthode que j’ai utilisée dans le passé et elle fonctionnera plus rapidement. Mais faites attention aux enregistrements qui ne sont suivis ou précédés d’aucun enregistrement entrelacé.
Re : Correspondance exacte et correspondance la plus proche pour mettre à jour une table avec une autre tableTX, je suis émerveillé par ta rapidité et ta compréhension.Votre réponse omet subtilement de mentionner une lenteur pour chaque boucle SN.
Alors que je terminais mon post, j'ai eu le début de cette idée :
Sous-définissez la grande table, en sélectionnant uniquement la fenêtre de date de la petite table.
Concaténez la table de sous-ensemble sur la petite table à l'exclusion de la colonne elapsedTime.
Trier la table concaténée par SN & dateTime
Remplissez les temps écoulés manquants avec la ligne précédente.
Mettez à jour la grande table avec la table concaténée.
Re : Correspondance exacte et correspondance la plus proche pour mettre à jour une table avec une autre tableJe vous suggère d'utiliser quelque chose comme :
theRows = dt2 << select rows where( dt2:serialNumber == dt21:serialNumber[i] &
dt2:dateTime <= dt1:dateTime );
if( N Rows( theRows ) > 0, targetRow = theRows[N Rows( theRows )] );