查找记录之间的平均时间

问题描述 投票:0回答:2

我在 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
sql google-bigquery aggregate-functions date-arithmetic
2个回答
2
投票

思路是先计算每个电话的返回时间,然后计算每个员工的平均时间。您可以使用 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

1
投票

可以使用窗口函数代替自连接表

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 转换并计算平均差异。

© www.soinside.com 2019 - 2024. All rights reserved.