旋转红移表

时间:2018-11-08 20:55:14

标签: sql pivot amazon-redshift

我认为我需要轮换我的数据库...或者也许我可以使用一些其他功能来获得想要的结果。下面是我当前的数据集的样子(我实际上有大约15个指标):

+----------------------------------+---------+------------------------+----------------+
|               ID                 | Metric 1|          Metric 2      | Overall Column |
+----------------------------------+---------+------------------------+----------------+
| 1                                | Red     | Yellow                 |        Red     |
| 2                                | Yellow  | Yellow                 |       Yellow   |
| 3                                |  Yellow |                        |       Yellow   |
+----------------------------------+---------+------------------------+----------------+

如果SQL中的任何一个指标为红色(即使它们也为黄色),则SQL中的总体列已具有逻辑“红色”(如果它们也为黄色),则为“黄色”。在某些情况下,两个指标可能是黄色,红色等。我要做的是添加一个新列,该列将具体显示哪个指标(或多个指标)导致了红色或黄色的整体价值。我在想的是某种枢轴,对于每个ID,将度量作为行值,将相应的颜色也作为行值(如果有意义),然后我可以执行listagg函数,然后将其加入会根据ID重新回到我的原始数据集中。

枢轴示例,忽略col2和col3。

+----------------------------------+---------+------------------------+----------------+
|               ID                 | col1    |          col2          | col3           |
+----------------------------------+---------+------------------------+----------------+
| 1                                | Red     |                        |                |
| 1                                | Yellow  |                        |                |
| 3                                |  Yellow |                        |                |
+----------------------------------+---------+------------------------+----------------+

在此之后,我可以列出该表以捕获多种颜色,然后将其加入到原始表中。我唯一要注意的是,如果单个ID同时具有红色和黄色度量标准,然后我执行listagg,即使总值基于红色度量标准,也会带来红色和黄色。希望SQL专家可以在这里为我提供帮助。

1 个答案:

答案 0 :(得分:0)

Redshift当前基于Postgres 8.03,因此缺少过去几年我们期望Postgres提供的许多功能。因此,想出一个涉及unnestarraylateral的解决方案是不可能的(我已经学到了这很难的方法)。

因此,除非所有这些新功能都可用,否则您可以取消透视源表,并通过使用union all并为每个度量标准列创建一个并集来创建每个ID及其度量标准的集合。

select a.id, metrics.metric
from tbl a
inner join (
    select id, metric1 metric from tbl where metric1 is not null
    union all select id, metric2 from tbl where metric2 is not null
    union all select id, metric15 from tbl where metric15 is not null
) metrics ON metrics.id = a.id
order by a.id, metrics.metric

结果

id | item
---+--------
1  | red
1  | yellow
2  | blue
2  | green
2  | pink
3  | orange

SQL Fiddle