sql - POSTGRESQL:将值分组为 ARRAY 的 ARRAY
问题描述
下面是我的输入数据表
输入 :
System NameYear Quarter Value 1 Value 2
1 2019 Q1 AB CD
1 2019 Q2 EF GH
1 2019 Q3 IJ KL
1 2019 Q4 MN OP
1 2020 Q1 XX YY
1 2020 Q2 ZZ MM
1 2020 Q3 NN KK
1 2020 Q4 TT QQ
我需要将值排序为每个系统名称的 Quarters [Q1,Q2,Q3,Q4] 的 ARRAY 值,并且在每个 Quarter 下它应该具有 Years [Y1,Y2]
Value 1 的数组值:{{" AB","XX"},{"EF","ZZ"},{"IJ","NN"},{"MN","TT"}}
值 2:{{"CD","YY" },{"GH","MM"},{"KL","KK"},{"OP","QQ"}}
预期的输出是这样的:
输出 :
System Name Value 1 Value 2
1 {{"AB","XX"},{"EF","ZZ"},{"IJ","NN"},{"MN","TT"}} {{"CD","YY"},{"GH","MM"},{"KL","KK"},{"OP","QQ"}}
我试过按季度使用 ARRAY_AGG 函数顺序。
解决方案
使用ARRAY_AGG
, 并执行两级聚合。首先,按系统和季度聚合以生成包含每个季度数组的一系列记录。然后,单独按系统再次聚合以生成单个数组数组。
WITH cte AS (
SELECT
System,
ARRAY_AGG(Value1 ORDER BY NameYear) AS Val1,
ARRAY_AGG(Value2 ORDER BY NameYear) AS Val2
FROM yourTable
GROUP BY System, Quarter
)
SELECT
System,
ARRAY_AGG(Val1) AS Val1,
ARRAY_AGG(Val2) AS Val2
FROM cte
GROUP BY
System;
演示
推荐阅读
- c# - 如何在多个线程中并行处理文件中的数据并将它们写入另一个文件,同时保持原始数据顺序(C#)
- swift - 如何在 Vapor 3 中保存带有孩子的模型并将保存的带有孩子的模型作为响应
- sql - Oracle 递归到 SQL Server?
- laravel - 尝试通过 Laravel 上的字符串访问图像
- angular - 如何使用带有 http 响应的异步等待
- javascript - 页面加载或刷新时JS不执行代码
- batch-file - Generate File Name Dynamically: Based on Content of the File (.bat)
- powershell - Remove SideIndicator field from compare object output in powershell
- vue.js - VueJS - How to separate class instances across multiple components? (With TS & decorators)
- c# - Slow first HTTP request with HttpWebRequest