假设我有两个表,它们成对地保存面向时间的数据(date,data)。其中一个是我的日常开支,另一个是我的日常收入。日期是指该费用/收入率的起始日期。
例如:如果我在收入表中有两个记录:(2020-01-01,50),(2020-02-14100)这意味着在2020-01-01和2020-02-14之间,我的收入是每天50个单位,而在2020-02-14之后,我的收入是每天100个单位。费用也一样。
我想在postgres表中为给定的时间间隔生成一个时间序列(可能使用time generate\ u series(date,date,interval)函数),其中一行如下所示:(day,income,expense)
例如,如果我的收入表是这样的:
+------------+--------+
| date | income |
+------------+--------+
| 2020-02-12 | 50 |
| 2020-02-14 | 100 |
+------------+--------+
费用如下:
+------------+--------------+
| date | expenses |
+------------+--------------+
| 2020-02-12 | 70 |
| 2020-02-13 | 50 |
+------------+--------------+
我希望从2020-02-12到2020-02-15的时间间隔结果如下所示:
+------------+--------+--------------+
| day | income | expenses |
+------------+--------+--------------+
| 2020-02-12 | 50 | 70 |
| 2020-02-13 | 50 | 50 |
| 2020-02-14 | 100 | 50 |
| 2020-02-15 | 100 | 50 |
+------------+--------+--------------+
例如,稍后我可以计算我的利润、亏损和其他统计数据。我怎样才能做到这一点?
2条答案
按热度按时间ivqmmu1c1#
这有点棘手。你可以
full join
但你需要填补空白。postgres不支持ignore nulls
在窗口函数中,一个选项是使用条件和来构建组,然后first_value()
:另一方面,也可以从选定的日期段开始(使用
generate_series()
),然后把table带来left join
s。其余逻辑不变:vddsk6oq2#
一种方法——如果数据不太大——是横向连接:
另一种选择是使用
generate_series()
在每个表上独立计算值。两者都是从最早的日期开始的,所以这是可行的:这是两种解决方案的混合体。
这很容易修改,以处理两个系列不在同一日期开始的情况。