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