另一行中最近的行 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
一个 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