Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 21/10/2013 10:35:06
- playmobil77d
- Membre
Jointure avec date la plus petite et la plus proche
Bonjour,
J'ai les 2 tables suivantes :
table1: table2:
id | name | t_timestamp id | name | taux | v_timestamp
--------|------------|---------------------- ---------|-------------|-------------|---------------------
1 | Nom1 | 2013-10-21 10:23 1 | Nom1 | 2.01 | 2013-10-20 10:24
2 | Nom4 | 2013-10-21 10:25 2 | Nom1 | 1.93 | 2013-10-21 09:33
3 | Nom2 | 2013-10-21 10:27 3 | Nom2 | 0.05 | 2013-10-19 10:00
4 | Nom4 | 2013-10-21 10:28 4 | Nom4 | 3.50 | 2013-10-21 10:25
J'aimerai faire une jointure entre ces 2 tables avec les conditions suivantes :
table1.name = table2.name (ça c'est bon)
et table2.v_timestamp soit la date la plus proche inférieur par rapport à table1.t_timestamp.
Dans l'idée voilà ce que je souhaiterais avoir comme table :
id | name | t_timestamp | id | name | taux | v_timestamp
--------|------------|----------------------|---------|-------------|-------------|---------------------
1 | Nom1 | 2013-10-21 10:23 | 2 | Nom1 | 1.93 | 2013-10-21 09:33
2 | Nom4 | 2013-10-21 10:25 | 4 | Nom4 | 3.50 | 2013-10-21 10:25
3 | Nom2 | 2013-10-21 10:27 | 3 | Nom2 | 0.05 | 2013-10-19 10:00
4 | Nom4 | 2013-10-21 10:28 | 4 | Nom4 | 3.50 | 2013-10-21 10:25
Auriez-vous une idée de comment faire ce genre de jointure ?
Merci d'avance pour votre aide.
Hors ligne
#2 21/10/2013 12:08:23
- guk92
- Membre
Re : Jointure avec date la plus petite et la plus proche
Oui, c'est possible, mais vous devez d'abord définir ce que signifie "la plus proche inférieur"... inférieur de combien d'unité ? -> 1 jour ? 1 heure ? 1 minute ? 1 seconde ?
Hors ligne
#3 21/10/2013 14:24:30
- playmobil77d
- Membre
Re : Jointure avec date la plus petite et la plus proche
C'est la le problème, c'est que je ne souhaite pas définir le combien d'unité.
Dans mon raisonnement, je souhaite sélectionner la ligne avec le le plus grand v_timestamp disponible et restant inférieur ou égal au t_timestamp avec des "name" identiques.
Pour le moment le mieux que j'ai pu faire c'est avec cette requête :
SELECT *
FROM table1, table2
WHERE table1."name" = table2."name"
AND table2."V_Timestamp" <= table1."T_Timestamp"
ORDER BY table1.id ASC, table2."V_Timestamp" DESC
Avec cette requête, j'obtiens presque le résultat souhaité mais j'ai encore des lignes en double :
id | name | t_timestamp | id | name | taux | v_timestamp
--------|------------|----------------------|---------|-------------|-------------|---------------------
1 | Nom1 | 2013-10-21 10:23 | 2 | Nom1 | 1.93 | 2013-10-21 09:33
1 | Nom1 | 2013-10-21 10:23 | 1 | Nom1 | 2.01 | 2013-10-20 10:24
2 | Nom4 | 2013-10-21 10:25 | 4 | Nom4 | 3.50 | 2013-10-21 10:25
3 | Nom2 | 2013-10-21 10:27 | 3 | Nom2 | 0.05 | 2013-10-19 10:00
4 | Nom4 | 2013-10-21 10:28 | 4 | Nom4 | 3.50 | 2013-10-21 10:25
Hors ligne
#4 22/10/2013 09:54:36
- guk92
- Membre
Re : Jointure avec date la plus petite et la plus proche
Bonjour,
Le problème c'est que si vous ne définissez pas une certaine limite, vous pourriez très bien vous retrouver avec des taux comme 0.00001 ou bien 99.99999 par exemple, et pas des chiffres aussi "joli" que 1.93 et 2.01
De tête, je dirais :
SELECT t1.id, t1.name, t1.t_timestamp, t2.id, t2.name, (t1.t_timestamp - t2.v_timestamp) / CAST(t.diff AS decimal) AS taux, t2.v_timestamp
FROM table1 t1
JOIN table2 t2 ON t1.name = t2.name AND t2.v_timestamp <= t1.t_timestamp
CROSS JOIN (SELECT (t1.t_timestamp - t2.v_timestamp) AS diff FROM table1 t1 JOIN table2 t2 ON t1.name = t2.name AND t2.v_timestamp <= t1.t_timestamp ORDER BY diff DESC LIMIT 1) t
ORDER BY t1.id ASC, t2.v_timestamp DESC;
Hors ligne
#5 22/10/2013 10:51:32
- playmobil77d
- Membre
Re : Jointure avec date la plus petite et la plus proche
Bonjour,
Merci pour ton aide guk92.
J'ai réussi à obtenir ce que je souhaitais avec cette requête :
SELECT DISTINCT ON (table1.id)
*
FROM
table1
LEFT JOIN table2 ON (table1.name = table2.name AND table2.v_timestamp <= table1.t_timestamp)
ORDER BY
table1.id ASC,
table2.v_timestamp DESC
Hors ligne
#6 22/10/2013 12:52:35
- guk92
- Membre
Re : Jointure avec date la plus petite et la plus proche
Tu calcules un taux, ou bien une simple différence entre table2.v_timestamp et table1.t_timestamp ?
S'il y a calcul du taux, qu'est-ce que le dénominateur ?
Hors ligne
#7 22/10/2013 14:01:44
- playmobil77d
- Membre
Re : Jointure avec date la plus petite et la plus proche
Je n'ai pas bien expliqué mes tables pardon.
dans la table2, le taux est une valeur prise à l'instant v_timestamp.
Il n'y a pas de calcul.Par exemple, j'ajoute la colonne prix à table1.
Ensuite je voulais rapproché les 2 tables de telle sorte que que chaque ligne de la table 1 puisse avoir l'information de taux la plus récente.
Hors ligne