IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Regroupement d'enregistrements pour alimentation d'une nouvelle table


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut Regroupement d'enregistrements pour alimentation d'une nouvelle table
    Bonjour,

    je travail sur une base de données géographique.
    je souhaite insérer des données depuis une table vers une autre et je souhaite faire une union de la géometrie des lignes qui ont le même numéro.

    j'ai une table "origine" :



    et je veux ceci dans ma table "destination" :



    ce que j'arrive à faire avec la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into destination (numero,nom_personne,surface,annee,the_geom)
    select numero,nom_personne,sum(surface),annee,geomunion(the_geom)as the_geom 
    from origine where numero ='27010596'group by numero,nom_personne,annee;
    PROBLEME : j'aurais 749 "numéro" uniques non auto-incrémentés dans la table destination et 3840 ligne dans ma table origine. il faut a chaque fois changer le numéro (il n'y a pas de logique dans la succession des numéros).

    dans une table avec juste deux colonnes (numero, the_geom),j'ai essayé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    insert into destination (numero, the_geom)
    select numero, geomunion(the_geom) as the_geom
    from origine group by numero;
    mais il me renvois :

    NOTICE: TopologyException: side location conflict 447526 2.51253e+006

    ERROR: GEOS union() threw an error!

    ********** Erreur **********

    ERROR: GEOS union() threw an error!
    État SQL :XX000

    avez vous une solution pour automatiser cette insertion.

    Un trigger, une moulinette ???

    Merci d'avance,

    cordialement,

    Nicolas

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Il manque quelque chose là :
    j'ai une table "origine" :



    et je veux ceci dans ma table "destination" :

    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut
    Bonjour,

    vous voulez parler de l'identifiant ?

    voici un exemple qui vous plaira peut-être plus:

    ma table d'origine,



    voici ce que j'arrive à faire avec une requête qui regroupe les géométrie en fonction du pacage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into gpi (num_pacage, the_geom)
    select pacage, geomunion (the_geom)as the_geom 
    from rpg76 where pacage ='76159614 'group by pacage,nom_exploi,annee;


    c'était des exemples fictifs que j'avais pris, mais visiblement mal choisis...
    en faitc'est le principe de fonctionnement qui m'intéresse.
    le problème n'est pas dans l'architecture de mes tables, il est dans l'automatisation de la requête qui, elle, fonctionne.

    il y a des numéros pacages qui se répètent mais sans logique et dont je veux regrouper les géométries dans une autre table. il faut que j'arrive à lui faire regrouper les géométrie des pacages qui sont identiques.

    peut-on en SQL faire ce genre de chose, faut-il construire une moulinette dans un autre langage PHP ...?

    merci beaucoup,

    cordialement,

    nicolas.
    Images attachées Images attachées   

  4. #4
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Citation Envoyé par nponzo Voir le message
    il y a des numéros pacages qui se répètent mais sans logique et dont je veux regrouper les géométries dans une autre table. il faut que j'arrive à lui faire regrouper les géométrie des pacages qui sont identiques.
    Salut,

    On peut faire plein de choses en SLQ mais il faut être précis ...

    Si je comprends bien, tu as des doublons dans ta première table (sur le champ pacage) et tu veux créer ta 2° table en les "regroupant" : ça signifie quoi ?
    Il faut d'abord que tu nous expliques ce que tu souhaites faire pour chacune des champs :
    - pour le gid, tu prends le min ? le max ? Tu en regénéres un nouveau ? Ou il est auto-incrémenté ?
    - pour le nom_exploi, comment tu fusionnes tes différents noms ? A moins que tu sois sûr que ce sont les mêmes pour une valeur de pacage donnée.
    - pour la surface, tu fais quoi : un somme ? une moyenne ? ...
    - etc ...

    EN bref, le SELECT dont tu va te servir lors de ton insertion doit te ramener une ligne par valeur distincte dans le champ pacage, il faut que tu associes un opérateur d'aggragation sur les autres.
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  5. #5
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut
    Bonsoir,

    en fait j'arrive à faire la requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO gpi (num_pacage, the_geom)
    SELECT pacage, geomunion (the_geom)AS the_geom 
    FROM rpg76 WHERE pacage ='76159614 'GROUP BY pacage,nom_exploi,annee;
    mais je vais détailler champ par champ :

    pour le gid, je pense que j'en ai pas besoins car j'ai un id autoincrementé dans ma table de destination. il se remplira automatiquement (d'après ce que je crois savoir)

    je regroupe les pacages identiques : j'ai des doublons dans la table d'origine et je veux une seul ligne par pacage dans la table de destination.

    pour les nom_explo, je suis sûr que ce sont les mêmes pour une valeur de pacage donnée.

    la surface, j'en ai plus besoin, mais pour répondre à la question, dans le premier post j'avais fait une somme :
    INSERT INTO destination (numero,nom_personne,surface,annee,the_geom)
    SELECT numero,nom_personne,sum(surface),annee,geomunion(the_geom)AS the_geom
    FROM origine WHERE numero ='27010596'GROUP BY numero,nom_personne,annee;
    mais ce n'est plus d'actualité.

    pour les années en revanche, je peux avoir plusieurs années par pacage dans ma table d'origine mais dans la table destination, elle n'est pas utilisée, car c'est la date du jour par défaut.

    enfin, je faiS une union de ma géométrie avec la fonction geomunion.
    j'ai un ensemble de polygone isolés avec le même pacage et je veux regrouper ceux qui ont le même pacage dans un seul 'multipolygon'.

    la requête fonctionne mais avec un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct pacage from rpg76;
    je peux voir que j'ai près de 750 numéros pacages différents.

    Il me faudrait automatiser, pour éviter que je retape la requête ci dessus plus de 700 fois en changeant à chaque fois le pacage.

    merci beaucoup,

    cordialement,

  6. #6
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    OK, les seuls champs qui t'intéressent sont pacage et the_geom, je n'avais pas compris.

    Si tu fais la requête suivante, tu auras également autant de lignes que de valeur du champ pacage distinctes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT pacage, MAX(the_geom)
      FROM rpg76 
     GROUP BY pacage
    Tu dois traiter le champ the_geom par un opérateur d'aggrégation (SUM,MAX, etc) car il ne fait pas partie de la clause GROUP BY. La remarque de mon message précédent s'applique ici : quel opérateur souhaites tu lui appliquer ?

    Le principe est que dans ta sélection, si tu as plusieurs lignes correspondant à une valeur de pacage distincte, tu dois spécifier comment tu "recalcules" le champ the_geom entre ces différentes lignes pour n'obtenir qu'une valeur dans ton résultat final.

    Am I clear ?
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/08/2008, 10h50
  2. Réponses: 16
    Dernier message: 04/10/2007, 13h06
  3. dupliquer des enregistrements dans une nouvelle table
    Par CINQ_MARSIENNE dans le forum Modélisation
    Réponses: 3
    Dernier message: 15/09/2007, 00h31
  4. Réponses: 11
    Dernier message: 09/01/2007, 17h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo