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 :

Duplication de lignes selon un champ


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 15
    Par défaut Duplication de lignes selon un champ
    Bonjour, je me casse la tête depuis hier sur un problème que je pensais simple et qui finalement ne l'est pas tant que ça...
    J'ai une table du type :

    type | n
    -------------
    a | 2
    b | 5
    c | 3

    et je voudrais par une requête obtenir :

    a
    a
    b
    b
    b
    b
    b
    c
    c
    c

    Donc dupliquer chaque ligne n fois. J'ai réussi avec une requête récursive à le faire pour une ligne de la table initiale, j'ai tenté des requêtes récursives imbriquées mais sans succès...
    Si quelqu'un a une idée, je veux bien de l'aide.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Vous pouvez par exemple faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT 	Type
    FROM 	LaTable
    INNER JOIN generate_series(1, (SELECT MAX(n) FROM LaTable)) AS Nb(x)
    	ON x <= n
    Mais ce type de requête n'est pas vraiment courant et n'a à première vue pas d'utilité. Pourquoi faites-vous cela ?

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 15
    Par défaut
    Merci beaucoup, je ne connaissais pas la fonction generate_serie ! Et ça marche très bien

    En fait j'ai des valeurs avec leur poids respectif (effectifs) et réparties par secteur. Il me faut calculer la médiane par secteur. J'ai trouvé une fonction d'agrégat qui calcule la médiane mais sans tenir compte des effectifs d'où ma question.
    Avec le résultat de la requête que vous m'avez communiquée, un simple group by avec l'agrégat median me donne le résultat attendu.

    C'est sûr qu'il aurait été plus simple de créer une fonction d'agrégat qui calcule la médiane en tenant compte des effectifs... (peut-être quand j'aurai du temps )

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Est-ce que cette requête ne vous donne pas ce que vous voulez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    WITH S AS (
    	SELECT 
    		secteur
    		,valeur
    		,poids
    		,SUM(poids) OVER(PARTITION BY SECTEUR ORDER BY Valeur ) as CS 
    		,SUM(poids) OVER(PARTITION BY SECTEUR) AS Somme
    	FROM 	LaTable
    )
    SELECT 	Secteur, AVG(valeur) AS MedianePonderee
    FROM 	S
    WHERE 	somme/2. BETWEEN CS - poids AND CS 
    GROUP BY Secteur

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 15
    Par défaut
    Alors là je m'incline... De plus cette requête est 10 fois plus rapide !
    C'est toujours pareil, quand on n'a pas le niveau on fait des choses compliquées pour compenser...
    Je vais donc passer maintenant 2 jours à assimiler ces fonctions de fenêtrage que je n'avais jamais utilisées jusque là.

    En tous cas merci car sur les forums beaucoup se posent des questions sur la médiane avec postgres mais je n'avais pas trouvé de réponse simple.

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

Discussions similaires

  1. Colorier une ligne selon la valeur d'un champ
    Par special-k dans le forum Composants
    Réponses: 5
    Dernier message: 21/05/2010, 16h43
  2. Réponses: 2
    Dernier message: 15/02/2010, 01h07
  3. Grouper des lignes selon un champs dans une listView
    Par Msysteme dans le forum Windows Forms
    Réponses: 10
    Dernier message: 26/02/2009, 19h13
  4. Découper une ligne selon un separateur sans le 1er champ
    Par pascalbout1 dans le forum Langage
    Réponses: 2
    Dernier message: 31/10/2007, 11h18
  5. Réponses: 3
    Dernier message: 17/10/2006, 09h16

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