Подсчет различных значений для дня в оракуле sql - PullRequest
0 голосов
/ 04 октября 2019

У меня есть таблица со следующими значениями:

sta_datetime | calling_number |called_number
01/08/2019    |   999999          | 9345435
01/08/2019    |   999999         | 5657657
02/08/2019    |   999999         | 5657657
03/08/2019    |   999999         | 9844566

Я хочу запрос, который подсчитывает уникальные значения для каждой даты во всем месяце, например:

sta_datetime | calling_number  | quantity_calls
01/08/2019   |   999999        |   2
02/08/2019   |  999999         |  0
03/08/2019   |  999999         |  1 

В дате 02/08/2019 - 0, потому что номера_телефона повторяются в дату 01/08 / 2019.

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Я думаю, вы можете использовать not exists, а затем group by следующим образом:

Select t1.sta_datetime, t1.calling_number, count(1) as quantity_calls
from your_table t1
Where not exists 
   (select 1 from 
    your_table t2
    Where t2.sta_datetime < t1.sta_datetime
    and t1.calling_number = t2.calling_number
    and t1.called_number = t2.called_number
    and trunc(t1.sta_datetime, 'month') = trunc(t2.sta_datetime, 'month'))
Group by t1.sta_datetime, t1.calling_number
Order by t1.calling_number, t1.sta_datetime;

Cheers !!

0 голосов
/ 04 октября 2019

Предполагая, что у вас есть записи на каждый день, вы можете просто посчитать первое в серии дней с данным вызываемым номером, используя lag():

select sta_datetime, calling_number,
       sum(case when prev_sta_datetime = sta_datetime - 1 then 0 else 1 end) as cnt
from (select t.*,
             lag(sta_datetime) over (partition by calling_number, called_number order by sta_datetime) as prev_sta_datetime
      from t
     ) t
group by sta_datetime, calling_number
order by sta_datetime, calling_number;

Если вы хотите считать только первоедата called_number была названа, затем:

select sta_datetime, calling_number,
       sum(case when first_sta_datetime = sta_datetime then 1 else 0 end) as cnt
from (select t.*,
             min(sta_datetime) over (partition by calling_number, called_number) as first_sta_datetime
      from t
     ) t
group by sta_datetime, calling_number
order by sta_datetime, calling_number;
...