postgresql 将每个用户的最新行转置到列

llmtgqce  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(122)

我有下表,其中给出了每个用户的多个电子邮件地址。
x1c 0d1x的数据
我需要在用户查询中将其展开为列,以便根据创建日期给予“最新”的3个电子邮件地址。因此,预期输出如下所示:
| 用户名|用户标识|email1|电子邮件2|电子邮件3|
| --|--|--|--|--|
| 玛丽| 123 |email protected(https://stackoverflow.com/cdn-cgi/l/email-protection)|email protected(https://stackoverflow.com/cdn-cgi/l/email-protection)的|email protected(https://stackoverflow.com/cdn-cgi/l/email-protection)的|
| 乔| 345 |email protected(https://stackoverflow.com/cdn-cgi/l/email-protection)的|[空]|[空]|

yhqotfr8

yhqotfr81#

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

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

  • 在PostgreSQL中插入带单引号的文本

详细的解释和说明:

  • PostgreSQL交叉表查询

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

  • 使用Tablefunc透视多列

这里的“特殊困难”是:

  • 缺乏核心价值观。

→我们在子查询中替换为row_number()

  • 不同数量的电子邮件。

→我们将外部SELECT限制为最多三个,并使用带有两个参数的crosstab(),提供可能的键列表。
注意NULLS LAST in the ORDER BY

相关问题