根据多个列值拆分行

Posted

技术标签:

【中文标题】根据多个列值拆分行【英文标题】:Split a row based on multiple column values 【发布时间】:2020-04-15 22:22:34 【问题描述】:

我在 postgres 中有下表(下面仅显示 2 行)。

trial_id    lead_sponsor    lead_sponsor_class  collaborators   collaborators_class 
NCT00004336 NCRR    NIH University of Michigan  Other
NCT00004337 NCRR    NIH null    null

我想根据lead_sponsor 和collaborators 列拆分每一行,并根据它们创建新列

预期输出是:

trial_id    sponsor_company           sponsor_role        agency
NCT00004336 NCRR                      lead_sponsor        NCRR
NCT00004336 University of Michigan    collaborators       University of Michigan
NCT00004337 NCRR                      lead_sponsor        NCRR

我尝试了几件事,但我无法找出解决方案(我是 postgres 的新手)

SELECT
    *,
    CASE WHEN lead_sponsor is not null THEN lead_sponsor
         WHEN collaborators is not null THEN collaborators
         ELSE ''
    END AS sponsor_company
FROM
    tb ;

这里的任何建议都会很有帮助。

谢谢

【问题讨论】:

【参考方案1】:

您可以使用横向连接进行反透视:

select x.*
from mytable t
cross join lateral (values 
    (trial_id, lead_sponsor,  'lead_sponsor', lead_sponsor),
    (trial_id, collaborators, 'collaborators', collaborators)
) x(trial_id, sponsor_company, sponsor_role, agency)
where x.sponsor_company is not null

Demo on DB Fiddle

试用ID |赞助商公司 |赞助商角色 |机构 :------------ | :---------------- | :------------ | :--------- NCT00004336 | NCRR |铅赞助商| NCRR NCT00004336 |大学 |合作者 |大学 NCT00004337 | NCRR |铅赞助商| NCRR

【讨论】:

以上是关于根据多个列值拆分行的主要内容,如果未能解决你的问题,请参考以下文章

使用 ETL 工具按列值将数据拆分为不定数量的表

根据列值拆分大型 csv 文本文件

根据列值将一行分解/拆分为多行

根据条件将单个数据行拆分为多个数据行的 SQL 脚本

根据列值拆分 Python 数据框,然后在算法中使用它们

Scala:我如何根据行数将数据帧拆分为多个 csv 文件