0

几天来,我一直在尝试解决一个看似简单的问题,但无论我采取哪种尝试,我似乎都无法完美地解决它。

我有两个简单的表,每个表都有 3 个列:call_date、call_time、caller_id,它们都是不言自明的。

第一个表包含呼入电话,第二个表包含呼出电话。

接到呼入电话后,应在 30 分钟内拨打相应的呼出电话。到目前为止一切顺利,这里没有问题,但这有点棘手:

  1. 入站表中可以有来自同一个 caller_id 的多个入站呼叫。
  2. 只有与前一个相关呼叫至少有 30 分钟距离的呼叫才被视为有效呼叫。因此,当某人打了四次电话时,比如说在 08:00、08:15、08:31 和 09:31,有 3 个有效的电话:08:00、08:31 和 09:31。因此,在每次有效通话后,您必须再次等待 30 分钟才能使下一次通话有效。
  3. 呼出表还可以包含对同一号码的无、一个或多个呼叫,所有这些呼叫都必须尽可能与呼入呼叫匹配。

我尝试了各种方法来解决这个问题,但它们都不是 100% 准确,总是留下一个或多个呼叫不匹配或未标记为有效等,我的头开始有点旋转。

现在,我从入站呼叫表中构建了一个巨大的表,为 previous_calltime 和 next_calltime 添加了许多列,这样我就可以计算时间戳之间的分钟数。我采取的第二种方法是创建单独的表格,其中每个号码每天的第一次和最后一次通话等,但总有一些事情不会加起来。

这是我的数据表的示例,入站和出站是相同的。

+----+-----------+----------+----------+
| id | call_date | call_time|caller_id
+----+-----------+----------+----------+
|  1 | 2013-06-01| 08:00    | 12345
+----+-----------+----------+----------+
|  2 | 2013-06-01| 08:20    | 12345
+----+-----------+----------+----------+
|  3 | 2013-06-01| 08:30    | 12345
+----+-----------+----------+----------+
|  4 | 2013-06-01| 08:32    | 555-999
+----+-----------+----------+----------+
|  5 | 2013-06-01| 08:47    | 555-999
+----+-----------+----------+----------+

也许有人可以为我指明一个粗略的方向,我应该采取哪种方法。任何建议表示赞赏。

Ps 我在这里尝试 100% 基于 MySQL 的方法,但理论上我也可以使用 PHP,以防有人认为在纯 SQL 中这样做很痛苦,而使用 PHP 可能更容易。

4

1 回答 1

0

要玩的初始代码。

这是忽略日期(现在),但应该给你一个有效调用的列表。不确定它会那么快,但使用它来填充有效呼叫的列表(或将入站呼叫标记为有效或无效)可能是一个想法。

使用上面的测试数据给出了我期望的结果:-

SELECT Sub1.*, 
        @valid := if(@PrevCallerId != Sub1.caller_id OR (TIME_TO_SEC(call_time) - @PrevValidCall) >= 1800, "valid", "invalid") AS valid_call,
        @PrevValidCall := if(@valid = "valid", TIME_TO_SEC(Sub1.call_time), @PrevValidCall),
        @PrevCallerId := Sub1.caller_id
FROM
(
    SELECT *
    FROM Inbound
    ORDER BY caller_id
) Sub1
CROSS JOIN (SELECT @PrevValidCall:= 0, @PrevCallerId := "", @valid := "") Sub2
于 2013-07-02T16:04:55.610 回答