0

我在一份包含数十亿行的报告中为电信公司处理 CDR(呼叫详细信息记录)数据,我要求一个 SQL 查询,让我分析订户对特定 MSISDN 的呼叫频率,以指导哪些订户应该是提供家庭交易或确定其网络中有多少同行拥有竞争对手的服务。

我的表格有很多细节,我得到了有用的细节,可以帮助我获得这种洞察力,表格包含:

  • PRI_IDENTITY(用户主叫号码)
  • RECIPIENT_NUMBER(被叫号码)
  • 时间戳(通话日期/时间)
  • Call_Duration(以秒为单位)
  • CALLED_HOME_NETWORK_CODE(收件人号码网络代码)
SELECT
  PRI_IDENTITY, RECIPIENT_NUMBER, 
  TO_timestamp(CUST_LOCAL_START_DATE,'yyyyMMddHH24miss')::Date AS Call_Date,
  ACTUAL_USAGE AS Call_Duration,
  CALLED_HOME_NETWORK_CODE
FROM TBL.CDR

样本数据

在此处输入图像描述

我需要弄清楚的输出包含以下内容:

  • PRI_IDENTITY
  • CALLED_HOME_NETWORK_CODE
  • 频率 5(当天 PRI_IDENTITY 调用 5 次的 RECIPIENT_NUMBERS 的计数)
  • 频率 10(当天 PRI_IDENTITY 调用 10 次的 RECIPIENT_NUMBERS 的计数)
  • 频率 15(当天 PRI_IDENTITY 调用 15 次的 RECIPIENT_NUMBERS 的计数)
  • 频率 20(当天 PRI_IDENTITY 调用 20 次的 RECIPIENT_NUMBERS 的计数)
    • 频率超过 20(PRI_IDENTITY 一天调用超过 20 次的 RECIPIENT_NUMBERS 个计数)

提示:图像上的样本数据上的 PRI_IDENTITY 和 RECIPIENT_NUMBERS 在真实数据中是完整的,由于隐私,我无法在线分享全部信息

4

1 回答 1

1

我假设您的通话频率是每月,而不是每天。无论如何,您需要两个级别的聚合:

select yyyymm, PRI_IDENTITY, CALLED_HOME_NETWORK_CODE,
       sum(case when cnt >= 5 then 1 else 0 end) as cnt_5,
       sum(case when cnt >= 10 then 1 else 0 end) as cnt_10,
       . . .
from (select date_trunc('month', call_date) as yyyymm,
             PRI_IDENTITY ,
             CALLED_HOME_NETWORK_CODE, 
             RECIPIENT_NUMBER, count(*) as cnt
      from t
      group by date_trunc('month', call_date) as yyyymm,
               PRI_IDENTITY, CALLED_HOME_NETWORK_CODE,  RECIPIENT_NUMBER
     ) x
group by yyyymm, PRI_IDENTITY, CALLED_HOME_NETWORK_CODE;
于 2020-03-14T15:26:21.453 回答