Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在一个表中的一个日期项与另一个表中的另一个日期项最接近时联接_Sql - Fatal编程技术网

Sql 在一个表中的一个日期项与另一个表中的另一个日期项最接近时联接

Sql 在一个表中的一个日期项与另一个表中的另一个日期项最接近时联接,sql,Sql,我试图从根本上协调我拥有的两个独立的付款表,一个是根据实际付款时的付款,另一个是在实际处理付款时的付款。一些大脑天才认为,这两张桌子都有一些可以连接在一起的独特ID不是一个好主意,所以我不得不走很长的路。我想这涉及到使用子查询连接两个表,但我不知道如何编写它。这是表格,我会在后面解释我想做些什么 付款表格 account_id payment_refID payment_date Amount 000001 AAA

我试图从根本上协调我拥有的两个独立的付款表,一个是根据实际付款时的付款,另一个是在实际处理付款时的付款。一些大脑天才认为,这两张桌子都有一些可以连接在一起的独特ID不是一个好主意,所以我不得不走很长的路。我想这涉及到使用子查询连接两个表,但我不知道如何编写它。这是表格,我会在后面解释我想做些什么

付款
表格

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
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
交易
表格

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
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
到目前为止,我的代码是这样的

SELECT *
from  payments a
join trasnaction b
on a.account_id = b.account_id2
and a.amount = b.amount
and [b.transactiondate is the closest transaction date after a.transactiondate. This is what I need help with]
因此,基本上,当我连接表时,我希望它看起来像这样:

在上面的示例中,连接基本上是1:1,支付参考AAA匹配到111,BBB匹配到222


我不能仅仅在一周后的日期加入,因为一些付款可能会更快或更慢地处理,并且可能在同一天有多笔付款。如果您在
付款、付款和
交易之间没有关系,我们将非常感谢您的帮助。付款和
交易将给您带来很大的麻烦


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

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

唯一的解决方案是假设两个表中的
payment\u 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

在这种情况下,
999
之后的id是什么???在这两个
表中
您使用的是哪种产品?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品
postgresql
oracle
sql server
db2
,…您确定在
付款.付款_refID
交易.付款_refID
之间没有关系的表吗?在您的示例AAA中,BBB和CCC都将匹配111,而不是111、222和333,因此如果您没有关于如何加入表的规则。。你不能。如果付款和交易之间的“距离”至少为一周。。您可以优化搜索,但您不能确定100%时是否会得到错误的结果