PRETEXT:
我目前正在尝试为客户创建详细而正确的通话统计信息。以前,Asterisk每次调用都会将呼叫详细信息存储在一行中。一行不足以存储可能发生在呼叫中的所有可能事情,并且数据通常会产生误导或错误。他们现在有一个新的表格式,在调用中每个事件存储一行。该表将为我们的大客户轻松包含数百万条记录。
我们尝试直接从此表中选择只有200k记录的测试服务器,但更高级的查询最终会耗尽。我们决定创建一个汇总表(所以我们每次调用都会返回一行,但现在可以提供更多详细信息)。我想对这些数据做很多事情,但如果我能解决这个“简单”问题,我相信我也会解决所有其他问题。
问题:
字段linkedid对于一次调用中的所有行都是相同的。对于一个linkedid,字段事件类型可以具有零个,一个或多个相同事件的出现。
我在汇总表中填写了一些数据:
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';
我尝试了多种不同的连接和子查询来更新多个字段,但无法使其工作。如果此操作也可能以某种方式与原始插入合并,那将是惊人的。
更好的方法是选择,而不使用汇总表,如果不花费太长时间,例如:上个月营业时间内呼叫者在被应答之前等待的平均时间(以及其他几个类似的数据)被称为的数字。