我一直在努力解决一个看似简单的问题,现在几天,无论我采取哪种尝试,我都无法完美地理解它。
我有两个简单的表,每个表有3个列:call_date,call_time,caller_id,所有这些都是不言自明的。
第一个表包含入站呼叫,第二个表包含出站呼叫。
收到呼入电话后,应在30分钟内拨打相应的外拨电话。到目前为止这么好,这里没有问题,但这是一个有点棘手的地方:
我尝试了各种方法解决这个问题,但是所有这些方法都不是100%准确,总是让一个或多个调用无法匹配或没有标记为有效等等,而且我的头开始旋转一点点。
现在我从我的入站调用表构建了一个巨大的表,为previous_calltime和next_calltime添加了许多列,因此我可以计算时间戳之间的分钟数。我采取的第二种方法是创建单独的表格,每个数字等每天都有第一次和最后一次调用,但总是不会加起来。
以下是我的数据表示例,in-and outbound是相同的。
+----+-----------+----------+----------+
| 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
+----+-----------+----------+----------+
也许有人可以指出我应该采取哪种方法。 任何建议表示赞赏。
P.S。我在这里尝试基于MySQL的100%方法,但理论上我也可以使用PHP,以防万一有人认为这在纯SQL中很难做到,而且使用PHP可能会更容易。
答案 0 :(得分: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