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

Requêtes PostgreSQL Discussion :

Regroupement de lignes par utilisation d'un range [9.3]


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre habitué Avatar de GAEREL
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 160
    Points : 147
    Points
    147
    Par défaut Regroupement de lignes par utilisation d'un range
    Bonjour à tous.

    je cherche à 'compacter' des données que je reçois unitairement sous la forme suivante :
    code (text) valeur (int)
    A 1
    A 2
    A 3
    A 4
    A 5
    A 7
    A 8
    A 9
    B 4
    B 5
    B 6
    B 7
    B 8

    Et que je cherche à compacter sous la forme de range :
    A [1,6)
    A [7,10)
    B [5,9)

    Je fouille du coté des Windows Functions mais sans succès.
    Une idée ?

    mes tests actuels pour info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    WITH H AS (    SELECT 'A'::text code, T.n valeur FROM generate_series(1,5) T(n)
        UNION
        SELECT 'A'::text code, T.n valeur FROM generate_series(7,9) T(n)
        UNION
        SELECT 'B'::text code, T.n valeur FROM generate_series(4,8) T(n)
    )
    SELECT     code,
        valeur,
        lag(valeur) OVER (PARTITION BY code ORDER BY valeur)        AS lag,
        lead(valeur) OVER (PARTITION BY code ORDER BY valeur)        AS lead,
        lead(valeur) OVER (PARTITION BY code ORDER BY valeur)  - lag(valeur) OVER (PARTITION BY code ORDER BY valeur)        AS diff,
        valeur - lag(valeur) OVER (PARTITION BY code ORDER BY valeur),
        lead(valeur) OVER (PARTITION BY code ORDER BY valeur) - valeur
    FROM H
    ORDER BY 1, 2

    Merci à tous de votre aide
    Fred.


    Add-On : Avec ceci je repère les bornes basses et hautes des ranges mais comment regrouper ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    WITH H AS (    SELECT 'A'::text code, T.n valeur FROM generate_series(1,5) T(n)
        UNION
        SELECT 'A'::text code, T.n valeur FROM generate_series(7,9) T(n)
        UNION
        SELECT 'B'::text code, T.n valeur FROM generate_series(4,8) T(n)
    )
    SELECT     code,
        valeur,
        CASE
            WHEN (valeur - lag(valeur) OVER (PARTITION BY code ORDER BY valeur)) IS NULL THEN 0
            WHEN (valeur - lag(valeur) OVER (PARTITION BY code ORDER BY valeur)) >1 THEN 0
            ELSE (valeur - lag(valeur) OVER (PARTITION BY code ORDER BY valeur))
        END AS A,
        CASE 
            WHEN (lead(valeur) OVER (PARTITION BY code ORDER BY valeur) - valeur) IS NULL THEN 0 
            WHEN (lead(valeur) OVER (PARTITION BY code ORDER BY valeur) - valeur) > 1 THEN 0
            ELSE (lead(valeur) OVER (PARTITION BY code ORDER BY valeur) - valeur) 
        END AS B
    FROM H
    ORDER BY 1, 2

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    J'ai voulu mettre mes méninges à l’épreuve et voici le résultat.
    1--> Création de la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create table tregroupeab
    (id serial primary key, c char(1), b int)
    2--> Insertion des données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    insert into tregroupeab (c , b )
    values('A', 1), ('A', 2), ('A', 3), ('A', 4), ('A', 5), ('A', 7), ('A', 8), ('A', 9), ('B', 4), ('B', 5), ('B', 6), ('B', 7), ('B', 8)
    3--> La requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select rbi.c ,borne_inf, borne_sup
    from 
    (select c, b+1 as borne_sup,  rank() OVER (partition by c ORDER by b) as r
     from tregroupeab as t
     where b+1 not in(select b from tregroupeab as u where u.c=t.c)) as rbs
     
    inner join
     
    (select c, b as borne_inf,  rank() OVER (partition by c ORDER by b) as r
     from tregroupeab as t
     where b-1 not in(select b from tregroupeab as u where u.c=t.c)) as rbi
     
     on rbs.c=rbi.c and rbs.r=rbi.r
    4--> Le résultat (apparemment plus exact que le tien)
    Nom : Sans titre.png
Affichages : 142
Taille : 2,3 Ko
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  3. #3
    Membre habitué Avatar de GAEREL
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 160
    Points : 147
    Points
    147
    Par défaut Très joli...
    Merci pour cette solution. (et pour le temps passé)

    J'applique de ce pas à mon cas concret... Je vais découvrir les temps de réponses et le gain (en nombre de lignes) pour ma table de 800.000 lignes...

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/04/2010, 15h59
  2. Parcourir un Db_GRID ligne par ligne
    Par sanosuke dans le forum Bases de données
    Réponses: 8
    Dernier message: 12/05/2008, 12h14
  3. [Shell] Regrouper les lignes par groupe de trois
    Par bazouil29 dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 04/01/2008, 21h43
  4. [VBA-E] Parcourir un range ligne par ligne
    Par boosty dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 19/04/2006, 13h44

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