首页 >数据库 >mysql教程 >如何将最近的三个用户电子邮件转置到 PostgreSQL 中的列中?

如何将最近的三个用户电子邮件转置到 PostgreSQL 中的列中?

Barbara Streisand
Barbara Streisand原创
2025-01-10 16:48:42958浏览

How to Transpose the Three Most Recent User Emails into Columns in PostgreSQL?

使用 crosstab() 在 PostgreSQL 中透视最近的用户电子邮件

挑战:您需要将包含多个用户电子邮件的表格转换为一种格式,其中每个用户的最近三封电子邮件显示为单独的列。

解决方案: PostgreSQL 的 crosstab() 函数(来自 tablefunc 扩展)提供了一个有效的解决方案。 这种方法涉及以下关键步骤:

<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 < 4
     ORDER  BY user_id
   $$
  , 'VALUES (1),(2),(3)'
   ) AS t (user_id int, user_name text, email1 text, email2 text, email3 text);</code>

细分:

  1. 子查询: 子查询使用 creation_date 基于 ROW_NUMBER() 对每个用户的电子邮件进行排名。 NULLS LAST 确保正确处理 NULL 创建日期。

  2. 过滤: WHERE rn < 4 子句将结果限制为每个用户最近的三封电子邮件。

  3. crosstab() 函数: crosstab() 函数对排名的电子邮件数据进行透视。 VALUES (1),(2),(3) 参数定义三个输出列(email1email2email3)。

  4. 输出: 最终查询返回一个表,其中包含 user_iduser_name 和三个最近的电子邮件地址作为单独的列。

该方法有效地处理了转置,为提取最新的电子邮件数据提供了清晰简洁的解决方案。如果您的 PostgreSQL 数据库中尚未启用 tablefunc 扩展,请记住启用它。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn