Postgresql 在两个时间序列表中按顺序选择最接近的日期并将其联接

Postgresql 在两个时间序列表中按顺序选择最接近的日期并将其联接,postgresql,Postgresql,对于整个审计跟踪,我尝试在一系列每周日期中选择与每个日期当天或之前最接近的记录。我需要在两个表上执行此操作,并按顺序连接每个日期的结果 我可以用python实现这一点,但速度太慢了,所以我尝试直接在postgres中实现,但我对循环/函数等非常不熟悉。我知道我将生成一系列日期,如下所示: 选择d::日期 从“2019-06-03”开始生成不带时区的序列时间戳-开始日期 ,不带时区的时间戳“2019-10-17”-结束日期 “7天”作为gsd; 下面是开始数据的样子 表1: +--------+

对于整个审计跟踪,我尝试在一系列每周日期中选择与每个日期当天或之前最接近的记录。我需要在两个表上执行此操作,并按顺序连接每个日期的结果

我可以用python实现这一点,但速度太慢了,所以我尝试直接在postgres中实现,但我对循环/函数等非常不熟悉。我知道我将生成一系列日期,如下所示:

选择d::日期 从“2019-06-03”开始生成不带时区的序列时间戳-开始日期 ,不带时区的时间戳“2019-10-17”-结束日期 “7天”作为gsd; 下面是开始数据的样子

表1:


+--------+--------------+--------+-----+
| idA    | history_date | status | idB |
+--------+--------------+--------+-----+
| 123456 | 2019-09-15   | 1      | 1   |
+--------+--------------+--------+-----+
| 123456 | 2019-09-17   | 2      | 1   |
+--------+--------------+--------+-----+
| 654321 | 2019-09-01   | 3      | 5   |
+--------+--------------+--------+-----+
| 654321 | 2019-09-25   | 5      | 5   |
+--------+--------------+--------+-----+

表2:

+-----+--------------+--------+
| idB | history_date | active |
+-----+--------------+--------+
| 1   | 2019-08-01   | true   |
+-----+--------------+--------+
| 1   | 2019-09-03   | false  |
+-----+--------------+--------+
| 5   | 2019-09-01   | true   |
+-----+--------------+--------+
| 5   | 2019-09-25   | false  |
+-----+--------------+--------+
例如,我需要选择2019-09-16和2019-09-23当天或之前最接近的记录

对于ex idA=123456,对于seq_date=2019-09-16,我将采用2019-09-15记录

对于ex idB=1,对于seq_date=2019-09-16,我将采用2019-09-03记录

然后,我将加入这两项记录,以获得2019-09-16 idA的完整记录

对于表1,第一步的结果是:

+--------+--------------+--------+-----+------------+
| idA    | history_date | status | idB | seq_date   |
+--------+--------------+--------+-----+------------+
| 123456 | 2019-09-15   | 1      | 1   | 2019-09-16 |
+--------+--------------+--------+-----+------------+
| 123456 | 2019-09-17   | 2      | 1   | 2019-09-23 |
+--------+--------------+--------+-----+------------+
| 654321 | 2019-09-01   | 3      | 5   | 2019-09-16 |
+--------+--------------+--------+-----+------------+
| 654321 | 2019-09-01   | 3      | 5   | 2019-09-23 |
+--------+--------------+--------+-----+------------+
+-----+--------------+--------+------------+
| idB | history_date | active | seq_date   |
+-----+--------------+--------+------------+
| 1   | 2019-09-03   | false  | 2019-09-16 |
+-----+--------------+--------+------------+
| 1   | 2019-09-03   | false  | 2019-09-23 |
+-----+--------------+--------+------------+
| 5   | 2019-09-01   | true   | 2019-09-16 |
+-----+--------------+--------+------------+
| 5   | 2019-09-01   | true   | 2019-09-23 |
+-----+--------------+--------+------------+
对于表2,第一步的结果是:

+--------+--------------+--------+-----+------------+
| idA    | history_date | status | idB | seq_date   |
+--------+--------------+--------+-----+------------+
| 123456 | 2019-09-15   | 1      | 1   | 2019-09-16 |
+--------+--------------+--------+-----+------------+
| 123456 | 2019-09-17   | 2      | 1   | 2019-09-23 |
+--------+--------------+--------+-----+------------+
| 654321 | 2019-09-01   | 3      | 5   | 2019-09-16 |
+--------+--------------+--------+-----+------------+
| 654321 | 2019-09-01   | 3      | 5   | 2019-09-23 |
+--------+--------------+--------+-----+------------+
+-----+--------------+--------+------------+
| idB | history_date | active | seq_date   |
+-----+--------------+--------+------------+
| 1   | 2019-09-03   | false  | 2019-09-16 |
+-----+--------------+--------+------------+
| 1   | 2019-09-03   | false  | 2019-09-23 |
+-----+--------------+--------+------------+
| 5   | 2019-09-01   | true   | 2019-09-16 |
+-----+--------------+--------+------------+
| 5   | 2019-09-01   | true   | 2019-09-23 |
+-----+--------------+--------+------------+
我的预期结果是:在seq_日期加入

+--------+------------+--------+-----+--------+
| idA    | seq_date   | status | idB | active |
+--------+------------+--------+-----+--------+
| 123456 | 2019-09-16 | 1      | 1   | false  |
+--------+------------+--------+-----+--------+
| 123456 | 2019-09-23 | 2      | 1   | false  |
+--------+------------+--------+-----+--------+
| 654321 | 2019-09-16 | 3      | 5   | true   |
+--------+------------+--------+-----+--------+
| 654321 | 2019-09-23 | 3      | 5   | true   |
+--------+------------+--------+-----+--------+

对于idA=654321,您如何从2019-09-03到2019-09-16?对我来说,算法需要更多的描述。@LaurenzAlbe如果有帮助的话,我为每个表添加了一个中间步骤