【问题标题】:The nearest row in the other table另一个表中最近的行
【发布时间】: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


【解决方案1】:

完全未经测试:我需要样本数据和数据库,怀疑的领域是日期的转换和日期数学......因为我不知道这是什么 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 

【讨论】:

  • 注意:这是一个做某事的解决方案......它可能不是高性能/最佳的。下一步是把它做好,然后让它变得更好......
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
相关资源
最近更新 更多