Ответ на этот вопрос может зависеть от вашей конкретной реализации SQL, но, в сущности, ваша проблема заключается в том, что вы пытаетесь избежать использования «наличия» при обработке агрегатной функции. Предложение «has» аналогично предложению where, но обрабатывается после этапа агрегирования.
Поэтому я не думаю, что вы найдете ответ «Упростите это в положение без дополнительной структуры».
Я бы посоветовал попытаться обойти проблему, создав представления, которые выполняют агрегацию, прежде чем вы попадете в ту часть, где вам нужно предложение HAVING. Если вы примените этот пункт заранее, вам будет лучше.
Создание дополнительного столбца означает, что вам нужно его поддерживать. Создание представления означает, что вам нужно поддерживать его. Каждый раз, когда вы поддерживаете дополнительный столбец, вы меняете набор данных, а изменение представления означает, что вы меняете код. В зависимости от вашей среды одно может быть желательным по сравнению с другим, но в большинстве случаев я бы предпочел мнение. Изменение данных, как правило, менее надежно, чем изменение кода.
Я не знаю, как sqlalchemy взаимодействует с представлениями, вам может потребоваться сделать их непосредственно внутри базы данных. Я думаю, так будет проще.
Если вы абсолютно не можете использовать базу данных для создания представлений, я думаю, ArcPy может.
http://desktop.arcgis.com/en/arcmap/10.3/tools/data-management-toolbox/create-database-view.htm
и запрос
arcpy.CreateDatabaseView_management("c:/Connections/city_data.sde","trees","select objectid, owner, parcel from inventory where type = trees")
- это пример с этой страницы, и вы можете подключить к нему свой SQL-запрос.