Maison >base de données >tutoriel mysql >Comment transposer les données de ligne des e-mails des utilisateurs en colonnes dans PostgreSQL ?

Comment transposer les données de ligne des e-mails des utilisateurs en colonnes dans PostgreSQL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-10 16:02:41449parcourir

How to Transpose Row Data of User Emails into Columns in PostgreSQL?

Convertir les données des lignes en colonnes : afficher la dernière adresse e-mail de l'utilisateur

Question :

Vous avez plusieurs adresses e-mail par utilisateur dans votre tableau et vous souhaitez l'aplatir en colonnes afin qu'il affiche les trois adresses e-mail les plus récentes pour chaque utilisateur en fonction de la date de création.

Résultat attendu :

user_name user_id email1 email2 email3
Mary 123 [email protected] [email protected] [email protected]
Joe 345 [email protected] NULL NULL

Solution :

Pour ce faire, vous pouvez profiter de la fonction crosstab() du module tablefunc dans PostgreSQL :

<code class="language-sql">SELECT * FROM crosstab(
    $$SELECT user_id, user_name, rn, email_address
    FROM  (
        SELECT u.user_id, u.user_name, e.email_address
             , row_number() OVER (PARTITION BY u.user_id
                            ORDER BY e.creation_date DESC NULLS LAST) AS rn
        FROM   usr u
        LEFT   JOIN email_tbl e USING (user_id)
        ) sub
    WHERE  rn <= 3
    ORDER BY user_id, rn
    $$,
    'VALUES (1),(2),(3)'
) AS ct (user_id integer, user_name text, email1 text, email2 text, email3 text);</code>

Explication :

  • La sous-requête récupère l'ID utilisateur, le nom d'utilisateur et l'adresse e-mail de chaque utilisateur, ainsi que leurs numéros ordinaux. La fonction row_number() est utilisée pour déterminer l'ordre des boîtes aux lettres pour chaque utilisateur, où NULLS LAST garantit que les valeurs NULL sont considérées comme les dernières valeurs.
  • La fonction crosstab() transpose ensuite la boîte aux lettres en colonnes en utilisant les numéros de lignes comme clés. Le deuxième paramètre "VALUES (1),(2),(3)" de crosstab() précise les trois colonnes à créer.
  • L'instruction SELECT finale renvoie les données transposées, où les trois boîtes aux lettres les plus récentes de chaque utilisateur apparaissent dans les colonnes email1, email2 et email3.

Remarque :

  • Si chaque utilisateur dispose d'un nombre différent de boîtes aux lettres, vous pouvez remplacer "VALUES (1), (2), (3)" par une liste de toutes les valeurs clés possibles.
  • Notez l'utilisation de NULLS LAST dans la clause ORDER BY pour garantir que les valeurs NULL sont traitées comme les dernières valeurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn