使用串联的 Amazon Redshift Pivot

Posted

技术标签:

【中文标题】使用串联的 Amazon Redshift Pivot【英文标题】:Amazon Redshift Pivot using Concatenation 【发布时间】:2019-09-01 23:19:03 【问题描述】:

我有一张桌子,看起来像

|------|-------|---------|
|foo_id|country|foo_value|
|------|-------|---------|
|  1   |   US  |   abc   |
|------|-------|---------|
|  1   |   IN  |   def   |
|------|-------|---------|
|  1   |   DE  |   abc   |
|------|-------|---------|
|  2   |   US  |   xyz   |
|------|-------|---------|
|  2   |   IN  |   klm   |
|------|-------|---------|

这里 foo_id 和 country 的组合是唯一的。所以 1 和 US 将只有 1 行。

我想把它转成

|------|--------|---------|---------|
|foo_id|   US   |   IN    |    DE   | 
|------|--------|---------|---------|
|  1   |   abc  |   def   |    abc  |
|------|--------|---------|---------|
|  2   |   xyz  |   klm   |         |
|------|--------|---------|---------|

我搜索了这个问题,找到了 SQL Server 的答案,它使用“for XML”。

Sql PIVOT and string concatenation aggregate

这个答案使用“FOR XML”,但我不知道为什么我根本不处理 XML 时应该使用“FOR XML”。有没有更好的答案是纯 ANSI SQL 或者更适合红移?

【问题讨论】:

【参考方案1】:

您可以使用条件聚合:

SELECT 
    foo_id,
    MAX(CASE WHEN country = 'US' THEN foo_value END) AS US,
    MAX(CASE WHEN country = 'IN' THEN foo_value END) AS "IN",
    MAX(CASE WHEN country = 'DE' THEN foo_value END) AS DE
FROM mytable
GROUP BY foo_id

【讨论】:

谢谢。你知道如何逃避IN吗?它似乎也是SQL中的一个子句。我试过'IN' 但这不起作用 @KnowsNotMuch:我的错,应该是"IN" 不知道我做错了什么但是当我尝试做一个组时我得到错误Invalid operation: failed to find conversion function from "unknown" to character varying

以上是关于使用串联的 Amazon Redshift Pivot的主要内容,如果未能解决你的问题,请参考以下文章

不使用 jdbc 驱动程序查询 Amazon Redshift

使用 Amazon Redshift / PostgreSQL 进行队列分析

使用 Amazon Redshift / PostgreSQL 进行漏斗查询

amazon-redshift 中的 CONCAT 函数

使用自定义 Python 库 ua-parser 的 Amazon Redshift UDF

我们可以在 Amazon redshift 中使用 CTAS 创建表时使用压缩吗