|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Inscription : mars 2011 Messages : 4 ![]() |
Bonjour à tous,
Débutant en SQL, j'ai un petit problème pour effectuer une requête. J'ai 2 tables : une contenant des observations (heure => V1 et hauteur => V2), l'autre des prédictions (heure => V1 et hauteur => V2). Il faut que : pour chaque tuple dans la table prédiction je récupère l'observation dont V2 est maximale, parmi toutes les observations dans une plage de plus ou moins 1h par rapport à l'heure de prédiction (V1). Voici un exemple : Code :
Je pensais à une requête de ce genre : Code :
Si vous avez des suggestions, je suis preneur! Je vous remercie. |
||||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour,
Je n'ai pas bien compris ton exemple (il semble y avoir 3 colonnes dans ton jeu de données, alors que tu ne parle que de deux colonnes : V1 et V2 ?) Mais d'après l'explication que tu as données, je ferai quelque chose comme ça : Code SQL :
Je te laisse éventuellement adapter la fonction de date DATEADD (qui permet dans cette requête d'ajouter/retirer une heure) en fonction de ton SGBDR |
||
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Inscription : mars 2011 Messages : 4 ![]() |
Excuse moi, la première colonne n'existe pas : c'est juste le numéro du tuple (je travaille sous R).
J'utilise le package "sqldf" sous R pour effectuer mes requêtes SQL et il ne comprend pas la fonction dateadd en effet ; j'ai donc modifié ton code comme ceci (et je veux récupérer les infos de obs, non de pred) : Code :
En tout cas, merci d'avoir pris le temps de me répondre. |
||
|
|
00
|
|
|
#4 | |||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
tu as inversé l'ordre des tables dans la jointure externe par rapport à la requête que je t'avais donnée, il est donc normal que les résultats ne soient pas ceux attendus ! d'autre part : hmmm... tu peux nous en dire plus la dessus ? je ne comprend pas ! Dans ton jeu d'essai, il ne s'agit pas de date mais d'entier, pour tester, tu peux déjà faire simplement Code SQL :
|
|||
|
|
00
|
|
|
#5 | ||||||
|
Invité de passage
![]() Inscription : mars 2011 Messages : 4 ![]() |
Oui, j'ai oublié de le préciser, mes dates sont des entiers (nombre de jours depuis une date référence).
Désolé pour le 0.083, car dans mes vraies données la condition c'est plus ou moins 0.083 jour (i.e. plus ou moins 2h). Je fais passer dans l'exemple suivant cette valeur à 0.1 Je reprend pour que ce soit plus clair : Mes tables sont comme ceci : Code :
On devrait donc obtenir ceci : Code :
Code :
|
||||||
|
|
00
|
|
|
#6 | |||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
ce que te donne la requête que je t'ai donnée : Citation:
Citation:
Ton exemple ne correspond pas à ta demande
|
|||
|
|
00
|
|
|
#7 | ||||||
|
Invité de passage
![]() Inscription : mars 2011 Messages : 4 ![]() |
Oui, je suis vraiment désolé, j'ai répondu en speed hier soir
Quand j'ai dis "pour chaque ligne de pred", je sous-entendais aussi d'enlever directement les lignes de pred n'ayant pas de correspondance dans obs, d'où peut-être la confusion. J'ai en effet oublié de mettre 0.1 au lieu de 1 dans ton dernier code, ce qui me rend maintenant : Code :
Code :
Ca me renvoie maintenant : Code :
En effet, j'ai l'impression que quand le code arrive à la 3eme ligne de pred (37734.0 9), il renvoie toutes les valeurs de obs dont V1 est dans [37733.9 ; 37734.1], au lieu d'une seule valeur (celle dont V2 est maximale pour les obs où V1 est dans cet intervalle). Enfin bon, t'embête pas plus longtemps avec ça (je vais coder sous R), je te remercie pour ce que t'as fait et m'a appris la commande LEFT OUTER JOIN
|
||||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com