Использование разделов (оконных функций) в сочетании с агрегациями в MongoDB - PullRequest
0 голосов
/ 16 июня 2020

В MongoDB у меня есть документы, подобные приведенным ниже (я вычеркиваю названия вызовов для конфиденциальности):

enter image description here

Теперь мне нужно создать запрос для возвращать результаты, сгруппированные по имени звонка, и для каждого типа звонка мне нужно получить количество звонков по месяцам, дням и часам. Кроме того, в этом запросе мне нужно указать диапазон между двумя датами (включая время).

На сервере SQL это делается с помощью оконных функций (разделов) в сочетании с агрегатами, но как я могу сделать то же самое in Mon go?

Я использую компас MongoDB в качестве клиента mon go.

Мне нужно получить что-то, как показано ниже:

call name      month    day  hour  #ByMonth  #ByDay   #ByHour
GetEmployee    January  1    14    10         6       1    
GetEnployee    January  1    18    10         6       5
GetEmployee    January  3    12    10         4       4
GetEmployee    March    5    20    8          8       8
GetEmployee    April    12   17    45         35      35
GetEmployee    April    20   10    45         10      10

Например, для звонков GetEmployee распределение выглядит следующим образом:

  • 10 звонков в январе
  • 8 звонков в марте
  • 45 звонков в апреле

На январь 10 звонков распределяются следующим образом:

  • 6 звонков сделано 1 января (эти 6 звонков распределяются следующим образом: 1 звонок в 14 часов и 5 звонков в 18 часов )
  • 4 звонка совершены 3 января (все эти 4 звонка сделаны в 12 часов)

и так далее до конца месяцев.

Например, на SQL сервере, если у меня есть таблица ниже:

processName   initDateTime           
processA      2020-06-15 13:31:15.330
processB      2020-06-20 10:00:30.000
processA      2020-06-20 13:31:15.330
...
and so on

Запрос SQL:

select 
    processName,
    month(initDateTime),
    day(initDateTime),
    datepart(hour, initDateTime),
    sum(count(*)) over(partition by processName, year(initDateTime), month(initDateTime)) byMonth,
    sum(count(*)) over(partition by processName, year(initDateTime), month(initDateTime), day(initDateTime)) byDay,
    count(*) byHour
from mytable
group by 
    processName,
    year(initDateTime),
    month(initDateTime),
    day(initDateTime),
    datepart(hour, initDateTime)

Итак, H как сделать то же самое в пн go? вышеуказанные поля processName и initDateTime будут атрибутами call и created соответственно в mongodb.

...