sql - 将每个用户的最新行转换为列

标签 sql database postgresql crosstab transpose

我有下表,它为每个用户提供了多个电子邮件地址。

table sample

我需要将其展平到用户查询的列中。根据创建日期给我“最新的”3 个电子邮件地址。喜欢:

<表类="s-表"> <头> 用户名 user_id 电子邮件1 电子邮件2 电子邮件3 <正文> 玛丽 123 mary@gmail.com mary@yahoo.co.uk mary@test.com 乔 345 joe@gmail.com [空] [空]

最佳答案

使用 tablefunc 中的 crosstab()模块。

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);

我对第一个参数使用了美元引号,它没有特殊含义。在查询字符串中转义单引号很方便,这是一种常见的情况:

详细解释和说明:

特别是对于“额外的列”:

这里的特殊困难是:

  • 缺少键名。
    → 我们用 row_number() 代替在子查询中。

  • 不同数量的电子邮件。
    → 我们限制最大。在外部 SELECT 中使用三个,并使用带有两个参数的 crosstab(),提供可能的键列表。

关注NULLS LAST in the ORDER BY .

关于sql - 将每个用户的最新行转换为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23060256/

相关文章:

sql - 管理 SQLite 数据库子集版本

windows - 在 Windows 10 上安装 PostgreSql 12 时出现数据库集群错误

mysql - 根据 child 的数量获取父表的记录

sql - 从连接的表中获取数据

sql - 避免 MS Access 中的 SQL 注入(inject)

PHP 数量脚本无法正常工作

mysql - 如何连接 3 个表,其中 2 个表与另外 1 个表相连,但彼此不相连

MySQL 到 postgreSQL 迁移

postgresql - 杂散换行破坏转储/恢复时的源代码

SQL Server - boolean 文字?