根据行值将两个 postgres table 中的一些列合并到一个新的 table 中
Merging some columns from two postgres tables into a new table based on row value
你好 PostgresSQL 专家(也许这也是 Perl 的 DBI 的任务,因为我也恰好在使用它,但是......)我可能也在这里误用了一些术语,所以请多多包涵。
我有一组 32 个 table,每个都完全一样。每个 table 的第一列总是包含一个日期,而第二列包含每 24 小时可以更改一次的值(整数),一些样本会过时。在许多情况下,table 可能永远不会包含特定日期的数据。所以这里有两个这样的 tables 的例子:
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
我们的想法是将单独的 table 合并为一个,有点像网格,但样本放置在其自己列中的正确行中,并确保日期列(始终是第一个列)没有遗漏任何日期,看起来像这样:
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-01-01 为止共有 33 列。
现在,我试过 FULL OUTER JOIN
并且成功了。随后的尝试给我带来了麻烦,创建了一个长的级联 table 值在错误的位置或不小心破坏了数据。所以我知道如果我使用带有日期序列的一列的 table 并加入第一个数据 table,这将起作用,就像使用婴儿步骤测试我的理论一样:
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
我很受鼓舞,我想我的测试会更有野心一些,但是这会把一些行乱序放在 table 的底部,我不确定我是否输了数据与否,这次尝试使用 USING 作为替代:
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_list
在 select
和 order by
子句中明确。然后,我们需要枚举 sum
列,为每个列提供别名。
你好 PostgresSQL 专家(也许这也是 Perl 的 DBI 的任务,因为我也恰好在使用它,但是......)我可能也在这里误用了一些术语,所以请多多包涵。
我有一组 32 个 table,每个都完全一样。每个 table 的第一列总是包含一个日期,而第二列包含每 24 小时可以更改一次的值(整数),一些样本会过时。在许多情况下,table 可能永远不会包含特定日期的数据。所以这里有两个这样的 tables 的例子:
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
我们的想法是将单独的 table 合并为一个,有点像网格,但样本放置在其自己列中的正确行中,并确保日期列(始终是第一个列)没有遗漏任何日期,看起来像这样:
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-01-01 为止共有 33 列。
现在,我试过 FULL OUTER JOIN
并且成功了。随后的尝试给我带来了麻烦,创建了一个长的级联 table 值在错误的位置或不小心破坏了数据。所以我知道如果我使用带有日期序列的一列的 table 并加入第一个数据 table,这将起作用,就像使用婴儿步骤测试我的理论一样:
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
我很受鼓舞,我想我的测试会更有野心一些,但是这会把一些行乱序放在 table 的底部,我不确定我是否输了数据与否,这次尝试使用 USING 作为替代:
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_list
在 select
和 order by
子句中明确。然后,我们需要枚举 sum
列,为每个列提供别名。