我在 BigQuery 表(通话记录)中有以下数据:
数字 | 叫_at | 方向 | 员工 |
---|---|---|---|
1111 | 2023-01-02 13:00 | 进 | 约翰 |
1111 | 2023-01-03 12:00 | 进 | 约翰 |
1111 | 2023-01-04 18:00 | 出去 | 约翰 |
2222 | 2023-01-05 12:00 | 进 | 马克 |
3333 | 2023-01-04 08:00 | 进 | 约翰 |
3333 | 2023-01-04 17:00 | 进 | 约翰 |
2222 | 2023-01-07 09:00 | 出去 | 马克 |
3333 | 2023-01-07 15:00 | 出去 | 约翰 |
1111 | 2023-01-09 11:00 | 进 | 约翰 |
1111 | 2023-01-13 18:00 | 出去 | 约翰 |
如何获得给定员工回拨号码所需的平均时间。
换句话说,使用 SQL 查找给定数字的 INs 和 OUTs(如果有的话)之间的时间差,并为每个员工取平均值。
编辑: 我除外:
员工 | avg_hour |
---|---|
约翰 | 78.3 |
马克 | 45 |
思路是先计算每个电话的返回时间,然后计算每个员工的平均时间。您可以使用 CTE 或基于以下代码的嵌套查询来实现此目的,为了清楚起见,我将其分为两个查询,但无需实际创建表。
这个查询将创建一个只有 IN 调用的表,并且它们是第一次被回调。既然你说你是在计算时间,而不是天数,我假设你不能同时有两个通话,因为如果可以的话,重复项将在你对查询进行分组时消失:
CREATE TABLE callbacks AS
SELECT a.number
, a.called_at
, a.direction
, a.staff
, min(b.called_at) as callback
, min(b.called_at) - a.called_at as return_time
FROM (select * from your_table where direction = 'IN') a
INNER JOIN (select * from your_table where direction = 'OUT') b
ON a.number = b.number
AND a.staff = b.staff
AND a.called_at <= b.called_at
GROUP BY a.number, a.called_at, a.direction, a.staff
现在你所要做的就是计算每个员工回电话的平均时间。请注意,只会计算返回的调用,在您的示例中,第 1 行和第 2 行都将被计算为第 3 行的返回。
SELECT staff, avg(return_time) AS avg_return_time
FROM callbacks
GROUP BY staff
实现此目的的嵌套查询可以是:
SELECT staff, avg(return_time) AS avg_return_time
FROM (
SELECT a.number
, a.called_at
, a.direction
, a.staff
, min(b.called_at) as callback format ddmmyys.
, min(b.called_at) - a.called_at as return_time
FROM (select * from your_table where direction = 'IN') a
INNER JOIN (select * from your_table where direction = 'OUT') b
ON a.number = b.number
AND a.staff = b.staff
AND a.called_at <= b.called_at
GROUP BY a.number, a.called_at, a.direction, a.staff
)
GROUP BY staff
可以使用窗口函数代替自连接表
select staff,
avg(lead_called_at - called_at) avg_diff
from (
select t.*,
lead(direction) over(partition by number, staff order by called_at) lead_direction,
lead(called_at) over(partition by number, staff order by called_at) lead_called_at
from mytable t
) t
where direction = 'IN' and lead_direction = 'OUT'
group by staff
lead()
带回相同号码和工作人员的“下一个”呼叫的方向和时间戳。然后我们可以简单地过滤 IN/OUT 转换并计算平均差异。