Forum Clubic

Jointure entre tables

Bonjour,

Je vous expose mon problème, je souhaite créer une base de données qui permettrait d’analyser les comptages voiture dans une ville à partir de bornes.
Pour simplifier, j’ai pris des données fictives et supprimé certaines colonnes inutiles pour la lisibilité des données, et juste modifié les noms des id de chaque table pour éviter les ambiguïtés dans mon explication.

Pour mieux se représenter les choses et comprendre la suite, voici la structure de ma BDD :
Capture

J’ai en gros ces données en entrée, qui proviennent d’un fichier csv, les noms de colonnes, de 0 à 23, correspondent aux heures de la journée et les valeurs aux nombres de voitures détectées :

id_station date 0 1 2 3 4 23
747 05/04/2020 2 3 2 2 6 15
822 05/04/2020 2 2 3 4 5 12
514 06/04/2020 1 5 1 2 7 14

J’ai alors créé une table Mesure, un id Mesure correspond à une station à un jour donné, j’ai réalisé un total quotidien par station que j’ai concaténé à un autre fichier (qui ne possédait que les totaux quotidiens et non pas par heure). En bref, le df final, que j’ai exporté en csv puis insérer dans la BDD, ressemble à cela :

id_mesure id_station date total
1 747 05/04/2020 67
2 822 05/04/2020 85
3 514 06/04/2020 68

J’aimerais maintenant relier une table ‹ Découpage_heure › afin d’avoir une granularité horaire pour les mesures qui possèdent cette précision. En bref, j’aimerais que la table ‹ Découpage_heure › ressemble à cela :

id_decoupage id_mesure heure valeur
1 1 0 2
2 1 1 3
3 1 2 2
4 1 3 2
5 1 4 6
24 1 23 15
25 2 0 2
26 2 1 2
27 2 2 3
28 2 3 4
29 2 4 5
48 2 23 12
49 3 0 1
50 3 1 5
51 3 2 1
52 3 3 2
53 3 4 7
72 3 23 14

C’est après réflexion la structure de la BDD qui me semble la plus logique et facile à exploiter.

Seulement, je rencontre 2 problèmes :
-Comment récupérer les données horaires initiales (1ère image) et les faire correspondre à l’id_mesure, étant donné que dans la création et l’insertion des données Mesures, j’ai totalement laissé de côté les données horaires pour me concentrer sur les totaux quotidiens ? (Faudrait-il, au lieu de générer un identifiant unique ‹ id_mesure › dans la table Mesures, créer une double clé primaire associée id_station/date et ajouter ces 2 données comme attributs dans la table Découpage_heure, ainsi il détecterait la station/date correspondante ?)
-Comment insérer les données horaires dans la table Découpage_heure, les 0, 1, 2 …, 23 passant de nom de colonnes d’un fichier csv à valeur dans une table ?

J’ai bien conscience que c’est un pavé et peut-être pas clair par moment, je suis tout-à-fait prêt à fournir plus d’explications si besoin.
En tout cas, un énorme merci à toute personne qui pourra m’aiguiller sur ce sujet.

Bonne journée !

Salut,

J’ai du mal à comprendre l’utilité de ta table mesure, si elle ne sert qu’à stocker le total quotidien, la bonne requête sql te fournira aisément la valeur.
je fais abstraction de ta table decoupage_type, je ne sais pas comment elle se lie aux données. Je garderai ta table station, et je ferais une nouvelle table mesure avec pour colonnes (d’après ton énoncé): id_station, date, heure, valeur. Avec ça il te suffit de faire les bonnes requêtes pour exploiter ces données.
Concernant le peuplement de table à partir du csv, tu vas avoir 24 insertions par ligne. Je ne sais pas comment tu intègres ton fichier, mes les ETL (Talend par exemple) te permettent facilement de dénormaliser une ligne.

A+

Bonjour, merci pour votre réponse.
Les tables ‹ Mesure › servait justement à gagner du temps lorsque je n’avais pas directement l’information sur le total quotidien. Et la table ‹ Découpage_heure › servait car il n’y a que les derniers enregistrements qui possèdent cette information, divisée en 24 colonnes.
Donc, si je comprends bien, lorsque je possède les données par heure, faire 24 lignes (1 par heure), mais alors lorsque je ne possède que la valeur quotidienne, je laisse la colonne ‹ heure › vide et je mets le total de la journée dans ‹ valeur › ?
Merci à vous

Ah… Cet élément change la donne, le format de ton fichier csv, ne semble pas avoir de champ total, j’ai juste un doute sur ta colonne 23 qui semble être la somme des mesures de la journée et qui est alors incohérent avec les autres colonnes.
Ta solution de laisser le champ heure vide fonctionne, ça sera à prendre en considération dans des requêtes sql où tu voudrais des résultats par heure.