(Мода = значение, которое чаще всего встречается в данном наборе данных.)

У меня есть поле поиска в контактах, в котором указана специальность контакта. Я хотел бы найти режим специальностей всех контактов для учетной записи и указать это значение в учетной записи. (Кстати, это будет выполняться в пакетном задании ежедневно)

Вот что у меня есть на данный момент:

Исходный запрос: SELECT Id,AccountId, SpecialtyLookup__r.Name FROM Contact WHERE SpecialtyLookup__c != null

  1. Поместите идентификаторы учетных записей на карту
  2. Для каждой учетной записи на карте найдите режим соответствующих специальностей.

2.1 Если есть ничья, отсортируйте список ничьих в алфавитном порядке и выберите первый вариант.

  1. Отметьте победившую специальность в поле Specialty__c в учетной записи.

Мысли?

1
Cory O. Bennett 20 Авг 2019 в 22:21
2
Что вы подразумеваете под «режимом» списка? Используете ли вы здесь «моду» в статистическом смысле (то есть из знакомого трио среднего, медианы и моды)?
 – 
Derek F
20 Авг 2019 в 22:17
Да, я имею в виду статистическое значение режима: значение, которое чаще всего встречается в данном наборе данных.
 – 
Cory O. Bennett
20 Авг 2019 в 22:21
Я недостаточно работал с ними, чтобы написать полностью сформированный ответ, но похоже, что ГРУППИРОВАТЬ ПО ОБЪЕМУ или ГРУППИРОВАТЬ ПО КУБУ может значительно увеличить объем работы над запросом. Однако я не уверен, как агрегированные запросы работают в пакетном контексте или как эти функции работают с полями, запрашиваемыми в отношениях.
 – 
Thomas Taylor
20 Авг 2019 в 23:01
Да, я забыл, не может использовать AggregateQueries в пакетном режиме , но по ссылке есть обходные пути. Какой объем данных будет у вашего запроса? Обратите внимание, что вам нужно будет решить, что контакты одной учетной записи распределяются по пакетам с помощью простого запроса.
 – 
Thomas Taylor
20 Авг 2019 в 23:40
1
Это будет около полумиллиона контактов, около 100 тысяч аккаунтов.
 – 
Cory O. Bennett
20 Авг 2019 в 23:49

1 ответ

Лучший ответ

Схема решения:

start()

  • Запросить все учетные записи

execute()

  • Выполните агрегированный запрос для контакта WHERE Contact.AccountId IN:scope. Group By accountId, Specialty and Count(Id)
  • Изучите сводные результаты и режим вычислений (для каждой учетной записи)
  • Обновить учетные записи
2
cropredy 21 Авг 2019 в 00:26