微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据行值将两个postgres表中的某些列合并到新表中

如何解决根据行值将两个postgres表中的某些列合并到新表中

您好,Postgressql专家(也许这也是Perl的DBI的任务,因为我也碰巧正在使用它,但是...)我在这里可能还会误用一些术语,所以请多多包涵。

我有一组32个表,每个表彼此完全相同。每个表的第一列始终包含一个日期,而第二列包含可以每24小时更改一次的值(整数),某些示例的日期可能是追溯的。在许多情况下,表格可能永远不会包含特定日期的数据。因此,这是两个这样的表的示例:

  date_list      | sum      date_list  | sum
----------------------  --------------------------
 2020-03-12     |   4      2020-03-09  |     1
 2020-03-14     |   5      2020-03-11  |     3
                |          2020-03-12  |     5
                |          2020-03-13  |     9
                |          2020-03-14  |    12

想法是将单独的表格合并成一个表格,有点像网格,但是将样本放置在其自己的列中的正确行中,并确保date列(总是第一列)不缺少任何日期,看起来像这样:

   date_list     | sum1  |  sum2    |  sum3  .... | sum32
---------------------------------------------------------
 2020-03-08     |       |          |
 2020-03-09     |       |     1    |
 2020-03-10     |       |          |   5
 2020-03-11     |       |     3    |  25 
 2020-03-12     |     4 |     5    |  35
 2020-03-13     |       |     9    |  37
 2020-03-14     |     5 |    12    |  40

依此类推,到2020年1月1日为止,已有33列。

现在,我尝试做一个FULL OUTER JOIN,它成功了。后来的尝试使我感到麻烦,创建了一个长而级联的表,将值放置在错误的位置或不小心破坏了数据。因此,如果我使用具有日期序列的一列表并连接第一个数据表,就像使用婴儿步伐对我的理论进行测试一样,那么我知道这是可行的:

SELECT date_table.date_list,sums_1.sum FROM date_table FULL OUTER JOIN sums_1 ON date_table.date_list = sums_1.date_list

 2020-03-07     |     1
 2020-03-08     |      
 2020-03-09     |      
 2020-03-10     |     2
 2020-03-11     |      
 2020-03-12     |     4

我很鼓舞,我认为我的测试会更加雄心勃勃,但这会将一些行按顺序放到表的底部,并且我不确定这次是否丢失数据尝试使用替代方法

SELECT * FROM sums_1 FULL OUTER JOIN sums_2 USING (date_list);

结果:

 fecha_sintomas |  sum  |  sum  
----------------+-------+-------
 2020-03-09     |       |     1
 2020-03-11     |       |     3
 2020-03-12     |     4 |     5
 2020-03-13     |       |     9
 2020-03-14     |     5 |    12
 2020-03-15     |     6 |    15
 2020-03-16     |     8 |    20
    :               :        :
 2020-10-29     | 10053 | 22403
 2020-10-30     | 10066 | 22407
 2020-10-31     | 10074 | 22416
 2020-11-01     | 10076 | 22432
 2020-11-02     | 10077 | 22434
 2020-03-07     |     1 |      
 2020-03-10     |     2 |      
(240 rows)

我想我越来越近了。无论如何,我从哪里得到我想要的数据,即上面描述的数据网格?也许这是一个迭代过程,可以从使用DBI中受益?

谢谢

解决方法

您可以full join这样:

select date_list,s1.sum as sum1,s2.sum as sum2,s3.sum as sum3
from sums_1 s1
full join sums_2 s2 using (date_list)
full join sums_3 s3 using (date_list)
order by date_list;

using语法使date_listselect子句中的不合格列order by明确。然后,我们需要枚举sum列,并为其提供别名。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。