Изменить запрос SQL, чтобы избежать? - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть столбец с SQL-запросами к столбцу. Они реализованы в функции под названием Select_analysis

Форма:

Select_analysis (in_file, out_file, {where_clause})

Это для простых запросов и получает до, где предложение.

Пример:

запрос типа Select from roads where roads.width = 1

Появляется как:

Select_analysis(roads.shp,r_width_1m.shp, width = '1')

Теперь к актуальному вопросу: В поле с запросами некоторые из них содержат операторы group by и having.

Можете ли вы предложить способ упростить процесс, чтобы его можно было использовать с этой Select_analysis функцией?

Пример:

SELECT * from OT                  -- OT is a dataset
GROUP BY OT.CA                    -- CA is a number that may exist many times.Therefore we group by that field.
HAVING ((Count(OT.OBJECTID))>1)   -- an id that appears more than once.

Набор данных OT

objectid     CA
1            125
2            342
3            263
1            125

Мы группируем по CA.

О наличии: оно применяется к строкам, которые объявляются более одного раза. Который является объектом 1 в этом примере.

Моя идея состоит в том, чтобы создать еще один столбец, в котором будет храниться результат, к которому можно получить доступ с помощью простого оператора where в функции select_analysis

Пример: Набор данных OT

objectid     CA       count_of_objid_aftergroupby
1            125           2
2            342           1
3            263           1
1            125           2

1) мы создали новый столбец с запросом

2) мы просто помещаем 'where count_of_objid_aftergroupby> 1' в select_analysis.

Что вы думаете?

Ссылка на документацию по функциям http://pro.arcgis.com/en/pro-app/tool-reference/analysis/select.htm

1 Ответ

0 голосов
/ 01 ноября 2018

Ответ на этот вопрос может зависеть от вашей конкретной реализации 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-запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...