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 :

Regroupement de lignes par valeur d'une colone MAIS uniquement consecutives?


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Regroupement de lignes par valeur d'une colone MAIS uniquement consecutives?
    bonjour,

    Je cherche mais je ne trouve pas, alors je demande???

    Voila une série de data (pour faire simple):

    DATE .... PRIX
    2010-01-01 ....27.0000
    2010-01-06 ....27.0000
    2010-02-03 ....27.0000
    2010-02-21 ....29.0000
    2010-03-02 ....29.0000
    2010-03-12 ....27.0000
    2010-03-25 ....27.0000
    2010-03-26 ....31.0000
    2010-03-30 ....31.0000

    Voila la requete que je pensais bonne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MIN(DATE), MAX(DATE), PRIX 
    FROM _table 
    GROUP BY PRIX 
    ORDER BY DATE
    Voila le resultat:

    MIN(DATE) ....MAX(DATE) ....PRIX
    2010-01-01 ....2010-03-25 ....27.0000
    2010-02-21 ....2010-03-02 ....29.0000
    2010-03-26 ....2010-03-30 ....31.0000

    et je cherche a obtenir cela:

    MIN(DATE) ....MAX(DATE) ....PRIX
    2010-01-01 ....2010-02-03 ....27.0000
    2010-02-21 ....2010-03-02 ....29.0000
    2010-03-12 ....2010-03-25 ....27.0000
    2010-03-26 ....2010-03-30 ....31.0000

    En réalité c'est le ORDER BY qui est en cause en effet il semble que le GROUP BY PRIX met en place un ORDER BY PRIX implicite qui écrase la clause ORDER BY DATE. j'ai lu qu'une clause ORDER BY NULL annulait cette etat de fait mais cela ne me donne rien....

    Y a t'il une autre solution?????

    Merci d'avance.

  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,

    Attention à ne pas vous embrouiller, une clause ORDER BY trie les données, c'est tout ce qu'elle fait.
    Vous demandez un regroupement par prix (GROUP BY prix), et vous obtenez bien un regroupement par prix, trié selon la date.

    Pour votre problématique, si vous pouvez utiliser les fonctions analytiques, en particulier lag et lead, la solution sera assez simple.
    Quel SGBD utilisez vous?

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    J'utilise MYSQL 5.02

    Bien sur que j'obtiens bien un groupement par PRIX par ordre de DATE mais l'ordre de date est précédé de l'ordre de prix du au groupement.

    Ce que je cherche c'est a donner la priorité a l'ordre de DATE de manière à créer une rupture dans le groupement a chaque changement chronologique de Prix.
    ENFIN j'm comprend....

    Merci encore

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Comme ceci, mais côté perf ne vous attendez pas à quelque chose d'exceptionnel :
    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
      select min(dt) as dt_min, max(dt) as dt_max, prix
        from (
             select (select count(*) from MaTable as mt2 where mt2.dt <= mt.dt) -
                    (select count(*) from MaTable as mt3 where mt3.dt <= mt.dt and mt3.prix = mt.prix) as grp,
                    mt.dt, mt.prix
               from MaTable as mt
             ) as sr
    group by grp, prix
    order by min(dt) asc;
     
    dt_min     dt_max     prix
    ---------- ---------- -------
    2010-01-01 2010-02-03 27.0000
    2010-02-21 2010-03-02 29.0000
    2010-03-12 2010-03-25 27.0000
    2010-03-26 2010-03-30 31.0000

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    @ Waldar

    Merci ca marche nickel.
    pour l'instant je suis en test est c'est largement assez rapide mais ce traitement est destiné a s'appliquer sur une requête qui filtrera préalablement (WHERE) toute les lignes de prix d'une année il y en aura rarement plus de 300, mais dans une table qui aura plus de 10 000 lignes.
    Pensez vous que cela soit lent???

    Si non j'ai la possibilité d'appliqué une boucle PHP sur un recordset préalablement classé par DATE,PRIX et d'en déduire les mêmes regroupements; mais cela sera il mieux???

    merci

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Essayez les deux solutions, mais il y a de bonnes chances qu'en PHP ça réponde plus rapidement (un seul tablescan au lieu de trois).

Discussions similaires

  1. insérer des lignes par rapport a une valeur dans la ligne au-dessus
    Par samihichem dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/05/2015, 09h08
  2. Réponses: 1
    Dernier message: 16/07/2014, 20h10
  3. remplacer les retour de ligne par <br> dans une chaine?
    Par cortex024 dans le forum Langage
    Réponses: 2
    Dernier message: 03/12/2006, 17h22
  4. [VBA-E] Copie par valeur d'une feuille dans un nouveau classeur
    Par MatMeuh dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 17/05/2006, 22h38
  5. Réponses: 3
    Dernier message: 14/03/2006, 11h34

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