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

Langage SQL Discussion :

Agrégation conditionnelle, casse tête


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut Agrégation conditionnelle, casse tête
    Bonjour,

    Me voilà face à un épineux problème :

    Je travaille sur des données géographiques routières.

    Dans ma table, road j'ai (id, name, code, the_geom)
    Je cherche à agréger toutes les routes qui se touchent et qui ont les mêmes noms et codes.

    Pour ça j'ai 2 fonctions à ma disposition :
    ST_Union(geometry, geometry)
    ST_touches(geometry, geometry)

    La première additionne les 2 géométries en une seule, la seconde détermine si les 2 géométries se touchent.

    J'ai créer ma propre fonction d'agrégat ("geometry_sum") sur base de ST_union qui fonctionne exactement comme l'agrégat "SUM" existant dans le standart SQL

    Je peux donc facilement grouper mes routes avec la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name, code, geometry_sum(the_geom)
    FROM road
    GROUP BY r1.name, r1.code
    Il me reste à trouver comment faire en sorte que seules les routes qui se touchent soient groupées ...
    Et là ... je sèche
    Il faudrait en quelque sorte que j'ai accès dans ma requête à la valeur de l'agrégat en cours pour pouvoir tester s'il touche la géométrie. (pas sûr que ce soit très clair ce que j'écris)

    Donc je me tourne vers vos lumière en quête d'une solution.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Citation Envoyé par Ghurdyl Voir le message
    Il faudrait en quelque sorte que j'ai accès dans ma requête à la valeur de l'agrégat en cours pour pouvoir tester s'il touche la géométrie. (pas sûr que ce soit très clair ce que j'écris)
    Il faudrait pour cela une notion d'ordre si j'ai bien saisi votre problème.
    Un exemple de ce que vous avez en entrée et ce que vous souhaitez obtenir rendrait les choses un peu plus claires.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    J'ai résolu mon problème en faisant appel à d'autres fonction spatiales.
    Il s'agissait d'agréger tout les éléments ayant le nom et le code en commun et puis de diviser le résultat obtenu là où il n'y avait pas de contact entre les segments.
    Un peu tordu donc mais efficace.

    L'ordre des records n'a pas d'importance, du moins pas dans le sens où je l'entends.

    Cependant, pour la beauté de l'art en en faisant abstraction du fait que l'ont soit dans des requête spatiales, je me demande s'il est possible de filtrer les éléments à agréger.
    Non pas un simple "where" qui exclu purement et simplement des records qui ne seront donc agrégé à aucun autre, mais un filtre qui va faire en sorte qu'un record A soit agrégé avec un record B mais pas avec un record C alors qu'ils ont tout en commun sauf une le résultat de la comparaison de 2 de leur champs.
    Pas simple à comprendre, je sais donc voici de manière imagée :
    Table [ nom, code, geom ]
    {
    A : ['Nom 1', 12, 'Ligne(0 0, 1 1)]
    B : ['Nom 1', 12, 'Ligne(1 1, 2 2)]
    C : ['Nom 1', 12, 'Ligne(8 0, 9 0)]
    }
    fonction(A.geom, B.geom) = true
    fonction(A.geom, C.geom) = false
    fonction(B.geom, C.geom) = false

    => le résultat de la requête doit grouper A et B mais laisser C tout seul parce que le résultat de "fonction(A.geom, C.geom)" et "fonction(B.geom, C.geom)" est faux.

    Je marque résolu donc mais pour les féru de casse-tête SQLien je reste curieux.

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

Discussions similaires

  1. Casse-tête BO (filtre & agrégat)
    Par pgentils dans le forum Deski
    Réponses: 7
    Dernier message: 23/08/2007, 11h45
  2. [Tableaux] Casse têtes de boucles
    Par Anduriel dans le forum Langage
    Réponses: 5
    Dernier message: 28/06/2006, 01h24
  3. requête SQL un peu casse tête
    Par hellbilly dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/12/2005, 11h03
  4. Classe, pile, pointeurs et casse-tête!
    Par zazaraignée dans le forum Langage
    Réponses: 6
    Dernier message: 26/09/2005, 17h57
  5. casse-tête excel
    Par gregius dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2005, 17h38

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