旋转数据并将单个列放入具有相关行的多列中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数据并将单个列放入具有相关行的多列中相关的知识,希望对你有一定的参考价值。

我在Amazon Redshift(PostgreSQL)中有如下数据:

acct | id_cd |用户名

acc1 | 123 |查尔姆acc1 | 123 |史密斯acc1 | 123 |埃哈蒙acc1 | 123 |列宁acc2 | 234 |查尔姆acc2 | 234 |瑞蒂斯acc3 | 345 |贾巴尔维acc3 | 345 |双重acc3 | 345 |吉利acc4 | 345 | rshant

而且我需要它看起来像这样。

acct | id_cd |用户名1 |用户名2 |用户名3

acc1 | 123 | kchalm |史密斯|埃哈蒙acc1 | 123 |列宁| |acc2 | 234 | kchalm | rtheis |acc3 | 345 | jbalvi | twoods |吉利acc4 | 345 | rshant | |

我已经尝试了以下成功的尝试。为了创建3个用户名列,我使用带有WHERE标准的联接将数据从视图中拉出所需的次数。但是,我不禁感到比现在可以自动化该过程的方法更好的方法。有什么建议吗?

    SELECT
    ut.acct,
    ut.id_code,
    ut.username,
    ROW_NUMBER() OVER(PARTITION BY ut.account_code
ORDER BY
    ut.username DESC) AS row_num
FROM
    orig_user_table ut ;

select
    a.acct
    ,a.id_cd
    ,a.username1
    ,b.username2
FROM
    (
    SELECT
        acct,
        id_cd,
        username AS username1
    FROM
        vw_user_table_nums
    WHERE
        row_num = 1) a
LEFT JOIN (
    SELECT
        acct,
        username AS username2
    FROM
        vw_user_table_nums
    WHERE
        row_num = 2) b ON
    a.acct = b.acct
    ...
答案

从现有子查询开始,一种方法使用条件聚合而不是联接:

select
    acct,
    id_code,
    max(case when rn = 1 then username end) username1,
    max(case when rn = 2 then username end) username2,
    max(case when rn = 3 then username end) username3
from (
    select
        ut.*,
        row_number() over(partition by ut.account_code order by ut.username desc) as rn
    from orig_user_table ut 
) t
group by acct, id_code
order by acct, id_code;

以上是关于旋转数据并将单个列放入具有相关行的多列中的主要内容,如果未能解决你的问题,请参考以下文章

HBase:创建多个表或具有多列的单个表?

Oracle SQL 多列与单个范围/图例对齐

连接数据框会创建太多列

SQL Server 逗号分隔列到多列

mysql 从多列中选择值到单列中

Pandas:在多列中查找具有匹配值的行的 Pythonic 方法(分层条件)