加入一个表中的一个日期条目,该日期是与另一个表中的另一个条目最接近的日期

时间:2019-10-17 09:00:35

标签: sql

我正在尝试基本协调我拥有的两个单独的付款表,一个在实际付款时将付款作为基础,而另一个在实际处理时付款。某些天才决定将这两个表都具有可以结合在一起的唯一ID并不是一个好主意,因此我不得不走很长一段路。我想象这涉及使用子查询将两个表连接在一起,但是我不知道如何编写它。这是表格,稍后我将解释我想做的事情

img_array = [] for filename in glob.glob('pics/*.png'): img = cv2.imread(filename) height, width, layers = img.shape size = (width, height) img_array.append(img) out = cv2.VideoWriter('project.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 30, size) # die Zahl da gibt die FPS an for i in range(len(img_array)): out.write(img_array[i]) out.release()

payment

account_id payment_refID payment_date Amount 000001 AAA 01/01/2019 5.00 000001 BBB 03/01/2019 5.00 000001 CCC 05/01/2019 5.00 000001 DDD 31/01/2019 5.00 000001 EEE 02/02/2019 5.00 000001 FFF 28/02/2019 5.00 000001 GGG 05/03/2019 5.00

transaction

这是到目前为止我的代码的样子

account_id2          payment_refID        payment_date        Amount 
000001               111                  08/01/2019          5.00
000001               222                  10/01/2019          5.00
000001               333                  12/01/2019          5.00
000001               444                  08/02/2019          5.00
000001               555                  15/02/2019          5.00
000001               666                  03/03/2019          5.00
000001               777                  12/03/2019          5.00

所以基本上,当我加入表格时,我希望它看起来像这样:

在上面的示例中,联接基本上为1:1,付款参考AAA最高匹配111,BBB最高匹配222

由于某些付款可能会更快或更慢地被处理,并且同一天可能会有多笔付款,因此我将不能只加入一周后的日期。感谢您的帮助

1 个答案:

答案 0 :(得分:0)

如果您在payments.payment_refIDtransactions.payment_refID之间没有关系,则会遇到很大麻烦。

在您的示例AAA中,BBB和CCC都将匹配111,而不是111、222和333,因此,如果您没有关于如何联接表的规则。

如果付款和交易之间的“距离”是固定的(即一周),您可以优化搜索,但不能确定100%,因为当天付款可能会得出错误的结果。

唯一的解决方案是假设两个表中的payment_refID都是升序的,并且每笔交易都按年代顺序与其付款相关。 因此,您可以为所有付款和所有交易进行编号,并在该柜台上加入它们。

在Microsoft SQL Server中,您可以尝试以下操作:

;with
p as (
    select *, ROW_NUMBER() over (partition by p.account_id order by p.payment_date, p.payment_refID) n
    from payments p 
),
t as (
    select *, ROW_NUMBER() over (partition by t.account_id2 order by t.payment_date, t.payment_refID) n
    from transactions t
)
select *
from p
join t on p.account_id = t.account_id2 and p.n = t.n