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 MySQL Discussion :

Regrouper N tuples sans lien avec les données


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Regrouper N tuples sans lien avec les données
    Bonjour,

    Je cherche à regrouper des tuple à la manière d'un GROUP BY pour effectuer des "min()" et "max()" sur les regroupements mais de façon totalement "arbitraire".

    Imaginons une table avec 3 colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    id (int)
    date (datetime)
    valeur (float)
    avec plusieurs 10ène de millier de lignes dans la table.
    Les données sont a classé par date (ASC)

    Je voudrais pouvoir regrouper toute les N lignes, et sur ce regroupement ne récupérer que le min() et le max() de "valeur".

    J'aurrai donc au final N fois moins de ligne, avec pour chaque groupe le min, le max, et la date (dans l'idéal la première du groupe)

    Le truc c'est que ce nombre de ligne N est dynamique. Et je n'ai aucun élement dans les données pour faire un GROUP BY de façon «*classique*».

    L'objectif étant de soulagé le traitement PHP qui est fait sur les données en factorisant plusieurs millier de données en beaucoup moins, tous en gardant toujours le min et max de l'ensemble, 2 valeurs obligatoires pour l'utilisation des données ensuite.

    J'espère avoir bien expliqué l'idée

    Je ne sais pas si c'est possible, dans tous les cas merci d'avance pour vos réponses

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 53
    Points
    53
    Par défaut
    Je crois que j'essaierai de faire comme ça:

    Création d'une table temporaire avec une colonne de plus (PK) qui sert de compteur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE `ma_table_temp` (
    `pk` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
    `id` INT UNSIGNED NOT NULL ,
    `ma_date` TIMESTAMP NOT NULL ,
    `ma_valeur` FLOAT NOT NULL ,
    PRIMARY KEY ( `pk` ) 
    );
    On met tous les enregistrements dans cette table, PK servant à avoir une numérotation des enregistrements classés par date:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO ma_table_temp (id,ma_date,ma_valeur) SELECT id,ma_date,ma_valeur FROM ma_table ORDER BY ma_date;
    On sélectionne 1 enregistrements sur N (100 dans cet exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id,ma_date,ma_valeur FROM ma_table_temp WHERE (pk MOD 100)=0;
    Est-ce que cela répond (un peu) à ta question ? En tous cas je n'ai pas l'impression que le GROUP BY soit une bonne solution, d'autant moins qu'il ne te sert à rien (tu n'as pas besoin de faire un SUM, un COUNT, ...).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse, effectivement j'ai aussi cherché à créer une table temporaire pendant mes tests sans réussir.

    Ta solution est intéressante mais elle ne correspond pas exactement à ce que je cherche à faire, car la je ne peux pas récupérer le min et le max d'un regroupement, simplement une ligne sur N.
    Je pense aussi que le group by ne me sera pas d'une grande aide, mais j'ai quand même besoin d'avoir quelque chose de proche dans l'idée pour faire des "groupes" de ligne. Et ainsi extraire le min et le max de chaque groupe

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    La solution de mrcmrc n'est pas mal. Il faut juste aller un peu plus loin...
    Maintenant que tu as ta table temporaire classée par date avec des identifiants de 1 à X,
    tu peux extraire tes dates MIN et MAX par paquet par exemple de 100 lignes en essayant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MIN(ma_date) AS DateMin, MAX(ma_date) AS DateMax
    FROM ma_table_temp
    GROUP BY pk DIV 100

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponse, effectivement ça fonctionne bien, je pense que je vais rester sur cette idée, je doute de pouvoir trouver mieux.

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

Discussions similaires

  1. [AC-2007] Regrouper/fusionner/créer, une table/colonne avec les données d'autres colonnes
    Par Crachover dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/03/2014, 14h39
  2. Réponses: 3
    Dernier message: 14/04/2009, 21h18
  3. Origine de Visual C++ - lien avec les MFC
    Par drinkmilk dans le forum MFC
    Réponses: 5
    Dernier message: 18/04/2005, 10h47
  4. Génération de script SQL avec les données
    Par borgfabr dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/03/2004, 13h57
  5. Réponses: 13
    Dernier message: 14/10/2003, 14h31

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