我正在使用基于 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 查询,它向我建议了一个存储过程 - 请参阅 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表中的日期列更改为超级数据类型列表,因为这将为解析和使用此变量日期列表提供更大的灵活性。