dac*_*ogy 38 sql database postgresql transpose crosstab
我有下表,它为每个用户提供了多个电子邮件地址.

我需要将其展平为用户查询的列.根据创建日期向我提供"最新"3个电子邮件地址.
user.name | user.id | email1 | email2 | email3**
Mary | 123 | mary@gmail.com | mary@yahoo.co.uk | mary@test.com
Joe | 345 | joe@gmail.com | [NULL] | [NULL]
Run Code Online (Sandbox Code Playgroud)
Erw*_*ter 48
使用crosstab()从tablefunc模块.
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);
Run Code Online (Sandbox Code Playgroud)
我使用美元引用作为第一个参数,没有特殊含义.如果你必须在查询字符串中转义单引号,这是一种常见的情况,这很方便:
详细说明和说明如下:
特别是对于"额外列":
这里的特殊困难是:
缺少关键名称.
- >我们用row_number()子查询替换.
电子邮件数量不一.
- >我们限制到最大值.三个在外部SELECT
并使用crosstab()两个参数,提供可能的键列表.
Han*_*olm 16
如果其他人发现了这个问题,并且需要一个动态解决方案,你有一个未定义的列数要转置,而不是3,你可以在这里找到一个很好的解决方案:https://github.com/jumpstarter-io/ colpivot
| 归档时间: |
|
| 查看次数: |
88771 次 |
| 最近记录: |