|
23.05.2022, 09:57 | #1 |
Участник
|
как всегда в программистских задачах: помните, что группировка по полю без индекса - это Table scan. т.е. вам нужно подумать не как запрограммировать в Аксапте универсальный запрос. а о том, как сделать ваш код в целом быстрым и эффективным. возможно, стоит даже не ограничиться только SQL, а по-другому распределить нагрузку между SQL и AOS. уверяю вас, "универсальные запросы по произвольным полям" - это зло. лучше переделайте вашу схему данных. Последний раз редактировалось mazzy; 23.05.2022 в 10:02. |
|
|
За это сообщение автора поблагодарили: sukhanchik (4). |
23.05.2022, 23:50 | #2 |
Участник
|
Еще помучаю, если можно. Написал запрос.
В итоге, если: 1) взять COUNT(Field) order by Field DESC, то получается 2. 2) Если перебором, то получается 3 3) если в п.1 добавить фильтр по номенклатуре e которой реально 3, то получается 3. С чем это может быть связано? Для справки, если это может быть важно, Field - string |
|
24.05.2022, 07:30 | #3 |
Moderator
|
Цитата:
В таком случае, задача решается так: 1. Создается view1 по основной таблице, во вьюшке оба поля, по обоим полям стоит группировка. 2. Создается view2. View2 построено по view1, сделана группировка по ключевому полю (field1), поставлена функция count(recid) (второе поле тут строго говоря вообще не при делах, сount нужно делать по любому int64 полю, recId -наиболее очевидный кандидат). Во view2 в итоге будут находится записи в которых для каждого значения ключевого поля во втором поле будет находится число уникальных значений транзакционного поля в оригинальной таблице. |
|
24.05.2022, 08:53 | #4 |
Участник
|
Цитата:
Сообщение от DesparioN
Еще помучаю, если можно. Написал запрос.
В итоге, если: 1) взять COUNT(Field) order by Field DESC, то получается 2. 2) Если перебором, то получается 3 3) если в п.1 добавить фильтр по номенклатуре e которой реально 3, то получается 3. С чем это может быть связано? Для справки, если это может быть важно, Field - string Возможно стоит попробовать выполнение запроса на чистом SQL, без создания дополнительных вьюшек. В этом случае можно воспользоваться ORDER BY N, где N - это номер поля, участвующего в выборке. Note! Класс с вашим запросом должен исполняться на сервере.
__________________
// no comments |
|
24.05.2022, 08:54 | #5 |
Участник
|
Вы наверное ожидаете что order by будет применён к результату агрегирующей функции? В Аксапте оно так не работает. Только если, как вам уже советовали, явно зафиксировать результат агрегации в виде View, а потом уже внешним по отношению к View запросом отсортировать результат
|
|