PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#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

Pied de page des forums