首页 > 解决方案 > 根据行值将两个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_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 中受益的迭代过程?

谢谢,

标签: sqlpostgresqlsql-order-byfull-outer-join

解决方案


你可以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;

该语法使and子句中的using非限定列date_list明确。然后,我们需要枚举列,为每个列提供别名。selectorder bysum


推荐阅读