【发布时间】:2022-01-14 10:22:20
【问题描述】:
一张表是用户及其购买的样本。
Structure:
Email | NAME | TRAN_DATETIME (Varchar)
所以我们有客户电子邮件 + 名字和姓氏 + 交易日期
来自第二个系统的第二个表包含所有用户、他们的敏感数据以及他们何时在我们的系统中注册。
Simplified Structure:
Email | InstertDate (varchar)
我的任务是计算从销售中插入的行(第一个表)与包含用户及其敏感数据的行之间的分钟差异。 问题是第二个表包含很多行,我想找到插入到第二个表中的最近的时间行,因为有时它可能是几分钟的差异(延迟或延迟相反),有时可能是几天.
所以对于 x 电子邮件,我在第一个表中有一行:
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 <--
我写了一些查询,但我不知道如何匹配第二个表中最近的行
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]
【问题讨论】:
-
我强烈建议您使用
TIMESTAMP数据类型而不是VARCHAR来存储日期/时间信息。 -
什么是数据库?看起来像 Sybase 或 SQL Server。
-
如果您将日期存储为字符串而不是本地日期数据类型,那么 您 必须编写更多代码:已经由RDBMS 供应商。对于需要检查的字符串的每个实例,您至少必须执行代码将字符串转换为日期。大量浪费代码。
-
验证要求:“计算从销售(第一个表)插入的行与包含用户及其敏感数据的行之间的分钟差。”因为它是 M:M 关系,所以每个用户都有多个结果。您对“我想找到插入到第二个表中的最近的时间行”的评论意味着您正在为同一电子邮件选择不同的条目以进行不同的销售......我无法想象一个商业案例.因此,请解释为什么您在用户表中有同一用户的多条记录,或者为什么您不只是采用最“当前”的用户时间戳。..
-
这是 SSMS 数据库
标签: sql nearest-neighbor