首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建多列透视的PostgreSQL枢轴表?

如何创建多列透视的PostgreSQL枢轴表?
EN

Stack Overflow用户
提问于 2019-09-23 12:14:36
回答 2查看 587关注 0票数 1

我一直在探索PostgreSQL的crosstab()函数的tablefunc 扩展模块,作为生成枢轴表的一种方法。

它很棒,但似乎只适用于最基本的用例。它通常只支持三列输入:

  1. 保持不变的值列,作为行标签。
  2. 一列被旋转的值,成为新的列名。
  3. 一列值,成为各自的新枢轴列的值。

基本上是这样的:

代码语言:javascript
复制
+------+----------+-------+
| ITEM |  STATUS  | COUNT |
+------+----------+-------+
| foo  | active   |    12 |
| foo  | inactive |    17 |
| bar  | active   |    20 |
| bar  | inactive |     4 |
+------+----------+-------+

..。并制作这个:

代码语言:javascript
复制
+------+--------+--------+----------+
| ITEM | STATUS | ACTIVE | INACTIVE |
+------+--------+--------+----------+
| foo  | active |     12 |       17 |
| bar  | active |     20 |        4 |
+------+--------+--------+----------+

但是更复杂的用例呢?如果你有:

  1. 您希望保留的多个输入列-是否在输出中?
  2. 要将多个输入列转换为新列?

如下例所示:

代码语言:javascript
复制
+--------+-----------------+---------+--------+-------+------------------+
| SYSTEM |  MICROSERVICE   |  MONTH  | METRIC | VALUE | CONFIDENCE_LEVEL |
+--------+-----------------+---------+--------+-------+------------------+
| batch  | batch-processor | 2019-01 | uptime |    99 |                2 |
| batch  | batch-processor | 2019-01 | lag    |    20 |                1 |
| batch  | batch-processor | 2019-02 | uptime |    97 |                2 |
| batch  | batch-processor | 2019-02 | lag    |    35 |                2 |
+--------+-----------------+---------+--------+-------+------------------+

前三列应按每一行的原样结转(不进行分组或聚合)。而metric列有两个相关联的列(即valueconfidence_level)作为支点?

代码语言:javascript
复制
+--------+-----------------+---------+--------------+-------------------+-----------+----------------+
| SYSTEM |  MICROSERVICE   |  MONTH  | UPTIME_VALUE | UPTIME_CONFIDENCE | LAG_VALUE | LAG_CONFIDENCE |
+--------+-----------------+---------+--------------+-------------------+-----------+----------------+
| batch  | batch-processor | 2019-01 |           99 |                 2 |        20 |              1 |
| batch  | batch-processor | 2019-02 |           97 |                 2 |        35 |              2 |
+--------+-----------------+---------+--------------+-------------------+-----------+----------------+

我不确定这是否仍然符合“枢轴表”的严格定义。但是,这样的结果在crosstab()或任何其他现成的PostgreSQL函数中是可能的吗?如果不是,那么如何使用自定义PL/pgSQL函数生成它?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-23 12:18:58

您可以尝试使用条件聚合。

代码语言:javascript
复制
select system,MICROSERVICE , MONTH,
max(case when METRIC='uptime' then VALUE end) as uptime_value,
max(case when METRIC='uptime' then CONFIDENCE_LEVEL end) as uptime_confidence,
max(case when METRIC='lag' then VALUE end) as lag_value,
max(case when METRIC='lag' then CONFIDENCE_LEVEL end) as lag_confidence
from tablename
group by system,MICROSERVICE , MONTH
票数 1
EN

Stack Overflow用户

发布于 2019-09-23 14:59:24

另一种方法(我已经使用过)是将数据写入文件,使用单独的实用程序以所需的格式交叉表,并将结果导入新的表中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58062225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档