【问题标题】:Postgres, split single row into multiple rowsPostgres,将单行拆分为多行
【发布时间】:2021-02-17 07:19:32
【问题描述】:

我有一个表格,其中包含如下列:

+-------+------+-------+-------+-------+-------+
| age1  | val1 | age2  | val2  | age3  | val3  |
+-------+------+-------+-------+-------+-------+
| 30-40 | 34.5 | 41-50 | 32.01 | 51-60 | 29.13 |
+-------+------+-------+-------+-------+-------+

我想回来:

+-------+-------+
|  age  |  val  |
+-------+-------+
| 30-40 |  34.5 |
| 41-50 | 32.01 |
| 51-60 | 29.13 |
+-------+-------+

我最终使用 3 个这样的联合编写了一个大型查询,但这似乎不正确:

  select *
  from ( ... ) g1
  union
  select *
  from ( ... ) g2
  union
  select *
  from ( ... ) g3

有没有办法做到这一点而不会弄得一团糟?好像我错过了一些非常明显的东西。

【问题讨论】:

  • “有没有办法做到这一点而不造成混乱?”是的,它被称为规范化您的数据。
  • 源数据来自 CDC,它以这种不幸的方式聚合成行,我们实际上正在使用与此问题相关的项目对数据进行规范化,感谢您的帮助 (?) 输入。
  • @Belayer 粗鲁的回答。

标签: sql postgresql unpivot lateral-join


【解决方案1】:

在 Postgres 中,您可以通过横向连接有效地将列还原为行:

select x.*
from mytable as t
cross join lateral (values 
    (t.age1, t.val1), 
    (t.age2, t.val2), 
    (t.age3, t.val3)
) as x(age, val)

【讨论】:

  • 谢谢,效果很好,现在正在学习横向连接。
猜你喜欢
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
相关资源
最近更新 更多