PostgreSQL -展平数据-交叉表函数

yyyllmsg  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(172)

(第一篇文章对不起,我做错了什么)
我想扁平化一些规范化的数据,我有我的斗争与交叉表功能。
背景资料:

  • 我在我的pgsql数据库中导入了一个包含历史钻井数据的文件(我是地质学家)。下面是标题的屏幕截图。你可以看到它是平面数据。表名= wadl4_a117888 Historic data headers

因为我将不得不导入其他具有不同标题但类似数据的历史数据集(例如:来自文件A的litho 1和来自文件B的geol 1)。我想'翻译/标准化'的标题,并有所有的数据在一起。

  • 因此,我使用视图对数据进行了规范化。表视图名称= tblvw_wadl4_a117888_norm historic data normalized。注意:'pfield' =透视字段,'pvalue' =透视值
  • 然后,我'翻译'的历史标题到想要的。'field_sgq' =需要的报头。

translation table:
现在我想把这张table压平(见上一张截图)。将字段datasource、hole_ID、depth_from、depth_to保持为“键”。
最终结果:final result
我尝试使用case when为每个想要的header,但为同一个“key”创建了多行(holeid,depth_from,depth_to)。还尝试使用交叉表功能,但没有获得想要的结果。
谢谢你的帮助!干杯

jvlzgdj9

jvlzgdj91#

以下是示例代码,您可以修改它,因为它不包括您可能拥有的所有可能的列。我使用field_orig列而不是field_sgq列,因为它在屏幕截图中显示的示例数据中具有空值。

DROP TABLE IF EXISTS TEMPTable;
CREATE TEMPORARY TABLE TEMPTable
(
    datasource TEXT,
    holdeid TEXT
    ,depth_from NUMERIC
    ,depth_to NUMERIC
    ,field_orig TEXT
    ,field_sgq TEXT
    ,pvalue TEXT
);

INSERT INTO TEMPTable VALUES ('wadl4_a117888','WRVAC065',0.00,3.00,'projectcode','project','Yilgarn'),
('wadl4_a117888','WRVAC065',0.00,3.00,'weath','Weathering','5'),
('wadl4_a117888','WRVAC065',0.00,3.00,'clr1','Lith1_Color1','BN'),
('wadl4_a117888','WRVAC065',0.00,3.00,'clr2','Lith1_Color2','OR'),
('wadl4_a117889','WRVAC065',0.00,2.00,'projectcode','project','YilgarnT'),
('wadl4_a117889','WRVAC065',0.00,2.00,'weath','Weathering','2'),
('wadl4_a117889','WRVAC065',0.00,2.00,'clr1','Lith1_Color1','BNT'),
('wadl4_a117889','WRVAC065',0.00,2.00,'clr2','Lith1_Color2','ORY');

SELECT * FROM crosstab('select datasource,holdeid,depth_from,depth_to,field_orig,pvalue from TEMPTable',  $q$ values ('projectcode'),('weath'),('clr1'),('clr2') $q$)
             AS ct (datasource TEXT,
    holdeid TEXT
    ,depth_from NUMERIC
    ,depth_to NUMERIC,projectcode TEXT, weath TEXT, clr1 TEXT, clr2 TEXT);

相关问题