如何解决将多个 postgres 行重塑为单行,列名取自行中的字段?
在发布此内容之前,我已经花了很多时间进行搜索,但如果不使用 Pandas,我就无法弄清楚如何在 postgres 中执行此操作。我有以下电表数据,可以为每个时间戳测量 3 个不同的提要,但我不知道如何将其改造成更广泛的临时表:
表设置
CREATE TABLE "emeter_hourly" (
"time" timestamp NOT NULL,"device" text,"WATTHRA" float8,"WATTHRB" float8,"WATTHRC" float8
);
样本数据
INSERT INTO "emeter_hourly" ("hour","device","WATTHRA","WATTHRB","WATTHRC") VALUES
('2021-06-01 00:00:00','spa',1468.25,244,4.75),('2021-06-01 00:00:00','car',1960),('2021-06-01 01:00:00',444),150,15.5,42),('2021-06-01 02:00:00',556.75,208.125,10),990),('2021-06-01 03:00:00',149.75,230.5,10.25),628),('2021-06-01 04:00:00',564.5,224.5,11.5),16.25,1010);
我想要的输出是汇总每个时间戳的行并制作一个更宽的表,如下所示:
WATTHRA_spa WATTHRA_car WATTHRB_spa WATTHRB_car WATTHRC_spa WATTHRC_car
hour
2021-06-01 00:00:00 1468.25 0.0 244.000 0.00 4.750 1960.0
2021-06-01 01:00:00 150.00 0.0 15.500 0.00 42.000 444.0
2021-06-01 02:00:00 556.75 0.0 208.125 0.00 10.000 990.0
2021-06-01 03:00:00 149.75 0.0 230.500 0.00 10.250 628.0
我尝试使用 postgres crosstab
来实现这一点,但只能用于其中一列而不是所有 3 个 WATTHR 列。
在熊猫中,这相当简单:
df_p = df.reset_index().set_index(['hour','device']).unstack(level=1)
df_p.columns = [f'{x}_{y}' for x,y in df_p.columns]
假设每个时间戳可能有超过 2 行要转换为列,如何仅在数据库端在 SQL 中完成此操作?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。