Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据透视并将单列放入具有关联行的多列_Sql_Postgresql_Group By_Pivot_Amazon Redshift - Fatal编程技术网

Sql 数据透视并将单列放入具有关联行的多列

Sql 数据透视并将单列放入具有关联行的多列,sql,postgresql,group-by,pivot,amazon-redshift,Sql,Postgresql,Group By,Pivot,Amazon Redshift,我在Amazon Redshift(PostgreSQL)中有如下数据: acct | id_cd | username acc1 |123 | kchalm acc1 |123 | rsmith acc1 |123 | ehamon acc1 |123 | ljenin acc2 |234 | kchalm acc2 |234 | rtheis acc3 |3

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

acct    | id_cd   | username
acc1    |123      | kchalm  
acc1    |123      | rsmith  
acc1    |123      | ehamon  
acc1    |123      | ljenin  
acc2    |234      | kchalm  
acc2    |234      | rtheis  
acc3    |345      | jbalvi  
acc3    |345      | twoods  
acc3    |345      | jli  
acc4    |345      | rshant
我需要它看起来像这样

acct    | id_cd   |username1|username2|username3
acc1    |123      | kchalm  | rsmith  | ehamon  
acc1    |123      | ljenin  |         |   
acc2    |234      | kchalm  | rtheis  |
acc3    |345      | jbalvi  | twoods  | jli  
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;