另一行中最近的行 table

The nearest row in the other table

一个 table 是用户及其购买的样本。

Structure:

Email | NAME | TRAN_DATETIME (Varchar)

所以我们有客户电子邮件 + 名字和姓氏 + 交易日期

来自第二个系统的第二个 table 包含所有用户、他们的敏感数据以及他们在我们系统中注册的时间。

Simplified Structure:

Email | InstertDate (varchar)

我的任务是计算从销售(第一个 table)插入的行与包含用户及其敏感数据的行之间的分钟差异。 问题是第二个 table 包含很多行,我想找到在第二个 table 中插入的时间最近的行,因为有时可能会有几分钟的差异(延迟或延迟的相反)有时可能是几天。

所以对于 x 电子邮件,我在第一行中有一行 table:

E_MAIL          NAME        TRAN_DATETIME
p****@****.eu   xxx xxx     2021-10-04 00:03:09.0000000

但是我有 3 行,最新的是我想计算差异的那一行

Email           InstertDate
p****@****.eu   2021-05-20 19:12:07
p****@****.eu   2021-05-20 19:18:48
p****@****.eu   2021-10-03 18:32:30  <--

我写了一些查询,但我不知道如何匹配第二行中最近的行 table

SELECT DISTINCT TOP (100) 
          ,a.[E_MAIL]
          ,a.[NAME]
          ,a.[TRAN_DATETIME]
          ,CASE WHEN b.EMAIL IS NOT NULL THEN 'YES' ELSE 'NO' END AS 'EXISTS'
          ,(ABS(CONVERT(INT, CONVERT(Datetime,LEFT(a.[TRAN_DATETIME],10),120))) - CONVERT(INT, CONVERT(Datetime,LEFT(b.[INSERTDATE],10),120)))  as 'DateAccuracy'
          
      FROM [crm].[SalesSampleTable] a 
      left join [crm].[SensitiveTable] b on a.[E_MAIL]) = b.[EMAIL]

完全未经测试:我需要示例数据和数据库,可疑区域是日期和日期数学的转换....因为我不知道这是什么 RDBMS 和版本..考虑以下“伪代码”。

我们为 rowID 为 1 的日期之间的绝对秒数差分配一个行号。

WTIH CTE AS (
SELECT A.*, B.* row_number() over (PARTITION BY A.e_mail
                                   ORDER BY abs(datediff(second, cast(Tran_dateTime as Datetime), cast(InsterDate as DateTime)) desc) RN
FROM [crm].[SalesSampleTable] a 
LEFT JOIN [crm].[SensitiveTable] b
     on a.[E_MAIL] = b.[EMAIL])
SELECT * FROM CTE WHERE RN = 1