首页 > 数据库 > mysql教程 > 如何将用户电子邮件的行数据转置为 PostgreSQL 中的列?

如何将用户电子邮件的行数据转置为 PostgreSQL 中的列?

Mary-Kate Olsen
发布: 2025-01-10 16:02:41
原创
447 人浏览过

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

将行数据转为列:显示用户最新邮箱

问题:

您的表格中每个用户有多个邮箱地址,您希望将其展平为列,以便基于创建日期显示每个用户的最新三个邮箱地址。

预期输出:

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

解决方案:

为此,您可以利用 PostgreSQL 中 tablefunc 模块的 crosstab() 函数:

<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>
登录后复制

解释:

  • 子查询检索每个用户的用户 ID、用户名和邮箱地址,以及它们的序号。row_number() 函数用于确定每个用户的邮箱顺序,其中 NULLS LAST 确保 NULL 值被视为最新值。
  • 然后,crosstab() 函数使用行号作为键将邮箱转置为列。crosstab() 的第二个参数“VALUES (1),(2),(3)”指定要创建的三个列。
  • 最终的 SELECT 语句返回转置后的数据,其中每个用户的最新三个邮箱显示在 email1、email2 和 email3 列中。

注意:

  • 如果每个用户的邮箱数量不同,您可以用所有可能的键值列表替换“VALUES (1),(2),(3)”。
  • 注意在 ORDER BY 子句中使用 NULLS LAST,以确保 NULL 值被视为最新值。

以上是如何将用户电子邮件的行数据转置为 PostgreSQL 中的列?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板