如何解决为大量列取消旋转 Postgres
所以我一直在研究用于透视的交叉表,但不确定是否有更可扩展的方法来做到这一点。
现在我的结构看起来像
日期 | 数量1 | 数量2 | 数量3 |
---|---|---|---|
日期 | 1 | 2 | 1 |
日期 | 1 | 3 | 2 |
日期 | 2 | 4 | 1 |
日期 | 3 | 5 | 2 |
我想最好地将它变成这种格式
日期 | 姓名 | 金额 |
---|---|---|
日期 | 金额 1 | 1 |
等等等等
现在我遇到的问题是 Amount1 可以是动态的,并且可以随着时间的推移不断增加。我正在尝试不必对其进行硬编码,因为现在大约有 40 列,而且我可以看到它随着时间的推移而增加
解决方法
是的,除了列前缀之外,无需硬编码任何东西都是可能的:
SELECT t.date,s3."key" as name,s3."value" as amount
FROM t,LATERAL (SELECT *
FROM (SELECT ROW_TO_JSON(t.*)) s(c),LATERAL JSON_EACH(s.c) s2
WHERE s2."key" LIKE 'amount%') s3;
输出:
+-------------+----------+-------+
| date | key | value |
+-------------+----------+-------+
| 2021-01-01 | amount1 | 1 |
| 2021-01-01 | amount2 | 2 |
| 2021-01-01 | amount3 | 3 |
| 2021-01-02 | amount1 | 1 |
| 2021-01-02 | amount2 | 3 |
| 2021-01-02 | amount3 | 2 |
| 2021-01-03 | amount1 | 2 |
| 2021-01-03 | amount2 | 4 |
| 2021-01-03 | amount3 | 1 |
| 2021-01-04 | amount1 | 3 |
| 2021-01-04 | amount2 | 5 |
| 2021-01-04 | amount3 | 2 |
+-------------+----------+-------+
工作原理:
- 从行生成json
- 解析 json 并仅选择键具有特定前缀的值
编辑:(由戈登)
我认为不需要子查询。查询可以简化为:
SELECT t.date,je.key,je.value
FROM t cross join lateral
row_to_json(t.*) rtj(r) cross join lateral
JSON_EACH(rtj.r) je
WHERE je."key" LIKE 'amount%';
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。