RedShift:利用一个子查询中的字段值作为整个查询中的字段名称来扁平化数据

问题描述 投票:0回答:1

我正在使用基于 postgres 的 Amazon Redshift。我有一个名为“参与”的表,其中包含有关参与的各种数据。我有另一个表,其中有订婚日期,其中一次订婚有多个日期。我想查询它,以便在单个查询中我可以获得参与的所有数据。

假设订婚表如下:

参与度 标题 描述
1 小工具 第一季度小部件参与度
2 袋熊 第一季度袋熊参与度
3 草莓 第三季度草莓订婚

engagement_dates 表如下:

参与度 日期_名称 日期
1 开始 2024-01-01
1 发射 2024-03-03
1 结束 2024-03-05
2 开始 2024-01-05
2 结束 2024-03-12
3 饼干 2024-01-01
3 2024-03-03
3 x 2024-03-05

我希望能够查询它,以便获得类似以下内容的数据,而无需将查询硬编码为日期名称的特定值。

参与度 标题 描述 开始日期 发布日期 结束日期 cookie_日期 花_日期 x_日期
1 小工具 第一季度小部件参与度 2024-01-01 2024-03-03 2024-03-05
2 袋熊 第一季度袋熊参与度 2024-01-05 2024-03-12
3 草莓 第三季度草莓订婚 2024-01-01 2024-03-03 2024-03-05

这是否可以做到,或者我是否必须对 date_name 的值进行硬编码才能将它们取出?该解决方案对于所有 CASE 语句来说有点难看。

sql postgresql amazon-redshift
1个回答
0
投票

这将是一个动态 SQL 查询,它向我建议了一个存储过程 - 请参阅 https://docs.aws.amazon.com/redshift/latest/dg/c_PLpgSQL-statements.html

查询所需列的存储过程。然后这个 SP 可以执行这个动态 SQL,它可以只是一个 PIVOT 查询。这种使用存储过程的方法在某些流程中很有用,但对于交互式使用来说很麻烦。

如果您愿意将所有日期作为有序列表放在一列中 - 例如“start_date:2024-01-01,launch_date:2024-03-03 ...” - 那么这是一个 listagg()。

您可能需要考虑将engagement_dates表中的日期列更改为超级数据类型列表,因为这将为解析和使用此变量日期列表提供更大的灵活性。

© www.soinside.com 2019 - 2024. All rights reserved.