Страницы: 1
RSS
Расчет количества перезвонов по дате по каждому номеру телефона
 
Уважаемые форумчане, здравствуйте. Задача следующая: Необходимо посчитать количество перезвонов в день по номеру телефона. Если номер телефона звонил 6 раз в день, то количество баллов должно добавляться каждому нижестоящему за этот день, то есть: Номер телефона 577 позвонил 28.01.2020 в Город_1, после он перезвонил в Город_4 (после перезвона добавляем +1 балл Город_1). Дальше он позвонил в Город_3 (добавляем +1 балл нижестоящим, а это Город_1 и Город_4). После он позвонил в Город_4 (добавляем +1 балл Город_1, +1 балл Город_4 и +1 балл Город_3) Это схематично представлено, как выглядят начисления (в порядке лестницы). Если он звонил более двух раз, то нужно прибегнуть к такому же начислению баллов. Во вложении пример.
57728.01.20209:41:05Город_17 111111
57728.01.202010:07:19Город_47 11111
57728.01.202010:39:53Город_37 1111
57728.01.202011:17:15Город_47 111
57728.01.202012:43:40Город_27 11
57728.01.202013:18:55Город_37 1
57728.01.202017:01:00Город_17
 
Доброе время суток.
Версия на Power Query
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Телефон", type text}, {"Дата", type date}, {"Время", type time}, {"Город", type text}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"Телефон", "Дата"}, {{"temp", each Table.AddIndexColumn(Table.Sort(_, {"Время", Order.Descending}), "Кол-во баллов")}}),
    #"Expanded {0}" = Table.ExpandTableColumn(#"Grouped Rows", "temp", {"Время", "Город", "Кол-во баллов"}, {"Время", "Город", "Кол-во баллов"}),
    #"Sorted Rows" = Table.Sort(#"Expanded {0}",{{"Телефон", Order.Ascending}, {"Дата", Order.Ascending}, {"Время", Order.Ascending}})
in
    #"Sorted Rows"
 
Цитата
Андрей VG написал:
Доброе время суток.Версия на Power Query
Большое Вам спасибо!! Вы всегда помогаете, по крайней мере, сколько бы я вопросов не задавал на данном форуме)) Ради интереса, можно ли реализовать подобную механику формулами?
 
Цитата
NV.Telegin написал:
можно ли реализовать подобную механику формулами?
Если упорядочить данные по телефону, дате, времени, то можно и формулой
Код
=СЧЁТЕСЛИМН($A2:A$24;A2;$B2:B$24;B2)-1
Может быть и требуемый порядок возможно определить формулами, но это  к формулистам :)  Я сторонник ленивых вычислений - по требованию. Впрочем как и MVC
Изменено: Андрей VG - 07.02.2020 08:28:20
 
:) Спасибо Вам!!!
 
Цитата
Андрей VG написал:
#"Grouped Rows" = Table.Group(#"Changed Type", {"Телефон", "Дата"}, {{"temp", each Table.AddIndexColumn(Table.Sort(_, {"Время", Order.Descending}), "Кол-во баллов")}}),
Андрей, здравствуйте. Скажите, пожалуйста, не могли бы Вы рассказать, что делает эта группировка? Как после нее получился именно тот результат, который я ожидал?  
 
Цитата
NV.Telegin написал:
что делает эта группировка?
Группировка формирует подтаблицу, содержащую строки только с данные одного телефона одной даты.
Теперь представьте, что если у вас таблица только с данными по одному номеру одной даты. Что нужно сделать чтобы получит результат? Упорядочить строки по времени по не возрастанию и пронумеровать, начиная от нуля, с шагом в единицу, не так ли?
Естественно, с точки зрения оптимизации, чтобы потом не выполнять глобальную сортировку всей таблицы, можно было бы для той подтаблицы выполнить сортировку не по убыванию и нумеровать, начиная от числа строк подтаблицы минус единица, с шагом минус единица. Тогда, после разворачивания данных подтаблиц мы бы получили уже готовое состояние. Но это уже оптимизация.
Изменено: Андрей VG - 11.02.2020 08:43:33
Страницы: 1
Наверх