如果该事件发生在任何其他事件的 24 小时内,则计数

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

我在 BigQuery 中有以下表格。

foo.处置

在此输入图片描述

foo.poc

在此输入图片描述

以下查询返回拨打电话号码的总次数:

SELECT
        ANI_DIALNUM, COUNT(*) as Dialed_Frequency                                                                                                                                                                
FROM
(
        select ANI_DIALNUM FROM `foo.disposition`
        WHERE
                Skill_name like 'Support%IB%'
                AND parse_date('%m/%d/%Y', Start_Date) > '2024-01-01'
        union all
        select Contact_Name FROM `foo.disposition`
        WHERE
                Skill_name like 'Support%IB%'
        AND parse_date('%m/%d/%Y', Start_Date) > '2024-01-01'
) t                                                                                                                                                                                                              
WHERE
        ANI_DIALNUM NOT IN (select `Point of Contact` from `foo.poc`)
        AND NOT ANI_DIALNUM = '8.884157149E9'

GROUP BY ANI_DIALNUM
ORDER BY Dialed_Frequency desc

我有一个查询返回两列中匹配项出现的总次数。它似乎工作正常。我现在只想计算 24 小时内发生的情况。换句话说,如果每 24 小时内同一电话号码拨打的电话次数超过 3 次。找到匹配项后,24 小时期限将重置。呼。

sql google-bigquery
1个回答
0
投票

您将需要使用 cte 而不是子选择,以使其更易于阅读,这里有一些未经测试的代码,可以让您接近:

with _raw ( --deal with sub-select first
   select ANI_DIALNUM,
          datetime_trunc(parse_datetime('%m/%d/%Y %H:%M:%S', Start_Date || ' ' || Start_Time), HOUR) AS callHour
   FROM `foo.disposition`
   WHERE Skill_name like 'Support%IB%'
         AND parse_date('%m/%d/%Y', Start_Date) > '2024-01-01'
   union all
   select Contact_Name,
          datetime_trunc(parse_datetime('%m/%d/%Y %H:%M:%S', Start_Date || ' ' || Start_Time), HOUR) AS callHour
   FROM `foo.disposition`
   WHERE Skill_name like 'Support%IB%'
         AND parse_date('%m/%d/%Y', Start_Date) > '2024-01-01'
), _cull as (
   select *
   from _raw
   where ANI_DIALNUM NOT IN (select `Point of Contact` from `foo.poc`)
         AND NOT ANI_DIALNUM = '8.884157149E9'
), _window as (
   select *, 
          count(*) over (partition by ANI_DIALNUM 
                         order by callHour
                         range between interval 24 hour preceding and current row
          ) as hour24count
   from _cull
)
select ANI_DIALNUM, count(*) as cnt
from _window
where hour24count >=3
group by 1
order by 2 desc
© www.soinside.com 2019 - 2024. All rights reserved.