繁体   English   中英

将多行组合成单行,以 JSON object 为列

[英]Combine multiple rows into single row with JSON object as columns

我有一个表,我试图通过将所有 ID/部分组合组合成一行(总共有 3 个部分)嵌套 JSON 来减少数据集。表架构如下所示:

| ID       | Section  | Country  | Date   |
| -------- | -------- | -------- | ------ |
| 1        | 1        | US       | 1-1-11 |
| 1        | 2        | US       | 1-1-11 |
| 1        | 3        | US       | 1-1-11 |
| 1        | 1        | CA       | 1-1-11 |
| 1        | 2        | CA       | 1-1-11 |
| 1        | 3        | CA       | 2-2-22 |
| 1        | 1        | MX       | 2-2-22 |
| 1        | 2        | MX       | 2-2-22 |
| 1        | 3        | MX       | 2-2-22 |
| 2        | 1        | US       | 3-3-33 |

我想执行一个查询,将其转换为将 id/section 和国家/地区和日期组合成 JSON 字符串的东西

| ID/Section | Country/dates                      |
| ---------- | ---------------------------------- |
| "1,1"      | {"US;CA":”1-1-11;","MX":"2-2-22;"} |
| "1,2"      | {"US;CA":”1-1-11;","MX":"2-2-22;"} |
| "1,3"      | {"US":”1-1-11;","CA;MX":"2-2-22;"} |
| "2,1"      | {"US":”3-3-33;"}                   |

为此,您需要两个分组依据并连接所需的列。

首先,我们按 id、section、date 分组,之后仅按 id 和 section。

select id || ',' || section as id_section, '{'|| listagg(temp, ',') || '}' as country_dates
from (select id, section, '"' || listagg(country, ';') || '"' || ':' || '"' || date || '"' as temp
      from test.temp
      group by id, section, date) as t1
group by id, section;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM