借口:
我目前正在尝试为我们的客户创建详细且正确的呼叫统计信息。以前,Asterisk 将呼叫详细信息存储在每个呼叫的一行中。一行不足以存储呼叫中可能发生的所有事情,并且数据通常会产生误导或错误。他们现在有一种新的表格格式,可以在调用中为每个事件存储一行。该表将很容易包含我们大客户的数百万条记录。
我们尝试在只有 20 万条记录的测试服务器上直接从该表中进行选择,但更高级的查询最终会花费很长时间。我们决定创建一个汇总表(因此我们每次调用都返回一行,但现在有更多详细信息可用)。我想用这些数据做很多事情,但如果我能解决这个“简单”的问题,我相信我也会解决所有其他问题。
问题:
一次调用中的所有行的linkedid 字段都是相同的。对于一个linkedid,字段 eventtype 可以有零次、一次或多次发生相同事件。
我用一些数据填充汇总表:
INSERT INTO astcel_summary
(linkedid, starttime, endtime, callfrom, callto, direction)
SELECT
linkedid, MIN(eventtime), MAX(eventtime), cid_num, exten, IF ((context = 'from-extension'), 1, 0)
FROM astcel
GROUP BY linkedid;
BRIDGE_START 事件特别重要,因为它表明有人接听了电话。呼叫可以无人接听、接听甚至多次接听(转接、会议)。我想用每个调用的第一个(如果有的话)BRIDGE_START 事件中的几个字段来更新我的汇总表。
我已经能够像这样一次更新一个字段:
UPDATE astcel_summary, astcel
SET astcel_summary.answertime =
(
SELECT eventtime
FROM astcel
WHERE astcel.linkedid = astcel_summary.linkedid
AND astcel.eventtype = 'BRIDGE_START'
GROUP BY astcel.linkedid
)
WHERE astcel.linkedid = astcel_summary.linkedid
AND astcel.eventtype = 'BRIDGE_START';
我尝试了许多具有不同连接和子查询的变体来更新多个字段,但无法使其工作。如果这个操作也能以某种方式与原始插入合并,那将是惊人的。
更好的选择是不使用汇总表且不花费太长时间的方式,例如:在上个月的工作时间内,呼叫者在被接听之前等待的平均时间(加上其他几个类似的数据),按数字分组叫。