在 postgres 中分组时旋转
Pivoting while grouping in postgres
我一直在 postgres 中使用交叉表来转换 table,但现在我需要添加一个分组,我不确定这是否可行。
我从这样的结果开始:
Date Account# Type Count
-----------------------------------------
2020/1/1 100 Red 5
2020/1/1 100 Blue 3
2020/1/1 100 Yellow 7
2020/1/2 100 Red 2
2020/1/2 100 Yellow 9
2020/1/1 101 Red 4
2020/1/1 101 Blue 7
2020/1/1 101 Yellow 3
2020/1/2 101 Red 8
2020/1/2 101 Blue 6
2020/1/2 101 Yellow 4
我想像这样旋转它,日期和帐户的每个组合都有一行 #:
Date Account# Red Blue Yellow
---------------------------------------------
2020/1/1 100 5 3 7
2020/1/2 100 2 0 9
2020/1/1 101 4 7 3
2020/1/2 101 8 6 4
这是我写的代码 return 错误“提供的 SQL 必须 return 3 列:rowid、类别和值”这对我来说很有意义交叉表的理解。
SELECT *
FROM crosstab(
SELECT date, account_number, type, count
FROM table
ORDER BY 2,1,3'
) AS ct (date timestamp, account_number varchar, Red bigint, Blue bigint, Yellow bigint);
(我在示例 tables 中以简化格式写了日期,但它们是时间戳)
有没有其他方法可以让第一个 table 看起来像第二个?谢谢!
您可以进行条件聚合:
select
date,
account#,
sum(cnt) filter(where type = 'Red' ) red,
sum(cnt) filter(where type = 'Blue' ) blue,
sum(cnt) filter(where type = 'Yellow') yellow
from mytable
group by date, account#
我一直在 postgres 中使用交叉表来转换 table,但现在我需要添加一个分组,我不确定这是否可行。
我从这样的结果开始:
Date Account# Type Count
-----------------------------------------
2020/1/1 100 Red 5
2020/1/1 100 Blue 3
2020/1/1 100 Yellow 7
2020/1/2 100 Red 2
2020/1/2 100 Yellow 9
2020/1/1 101 Red 4
2020/1/1 101 Blue 7
2020/1/1 101 Yellow 3
2020/1/2 101 Red 8
2020/1/2 101 Blue 6
2020/1/2 101 Yellow 4
我想像这样旋转它,日期和帐户的每个组合都有一行 #:
Date Account# Red Blue Yellow
---------------------------------------------
2020/1/1 100 5 3 7
2020/1/2 100 2 0 9
2020/1/1 101 4 7 3
2020/1/2 101 8 6 4
这是我写的代码 return 错误“提供的 SQL 必须 return 3 列:rowid、类别和值”这对我来说很有意义交叉表的理解。
SELECT *
FROM crosstab(
SELECT date, account_number, type, count
FROM table
ORDER BY 2,1,3'
) AS ct (date timestamp, account_number varchar, Red bigint, Blue bigint, Yellow bigint);
(我在示例 tables 中以简化格式写了日期,但它们是时间戳)
有没有其他方法可以让第一个 table 看起来像第二个?谢谢!
您可以进行条件聚合:
select
date,
account#,
sum(cnt) filter(where type = 'Red' ) red,
sum(cnt) filter(where type = 'Blue' ) blue,
sum(cnt) filter(where type = 'Yellow') yellow
from mytable
group by date, account#