рассчитать частоту звонков абонента SQL Netezza - PullRequest
0 голосов
/ 14 марта 2020

Я работаю над данными CDR (Call Details Record) для телекоммуникационной компании в отчете с миллиардами строк, я прошу запрос SQL, который позволил бы мне проанализировать частоту звонков абонента, чтобы указать c 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

пример данных

enter image description here

Вывод, который мне нужно выяснить, приведен ниже:

  • Год
  • Месяц
  • PRI_IDENTITY
  • CALLED_HOME_NETWORK_CODE
  • Частота 5 (Количество RECIPIENT_NUMBERS, которые PRI_IDENTITY вызывал 5 раз в день)
  • Частота 10 (Количество RECIPIENT_NUMBERS, которые PRI_IDENTITY вызывали 10 раз в день)
  • Частота 15 (Количество RECIPIENT_NUMBERS, которые PRI_IDENTITY вызывал 15 раз в день)
  • Частота 20 (Количество RECIPIENT_NUMBERS, которые PRI_IDENTITY вызывали 20 раз в день)
    • Частота более 20 (The количество RECIPIENT_NUMBERS, которые PRI_IDENTITY вызывал более 20 раз в день)

ПОДСКАЗКА: PRI_IDENTITY и RECIPIENT_NUMBERS на данных образца на изображении заполнены в реальные данные и из-за конфиденциальности я не мог поделиться всей информацией онлайн

1 Ответ

1 голос
/ 14 марта 2020

Я предполагаю, что вы имеете в виду в месяц для частоты вызовов, а не в день . В любом случае, вам нужны два уровня агрегации:

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;
...