我有一列,其中有对一列的SQL查询。这些是在名为Select_analysis
表格:
Select_analysis (in_file, out_file, {where_clause})
它用于简单查询,并接收直到where子句。
示例:
诸如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分组。
关于具有:它应用于对象ID超过一次的行。在此示例中,对象ID是1。
我的想法是制作另一列存储结果的列,该结果将通过select_analysis
函数中的简单where子句进行访问
示例: OT数据集
objectid CA count_of_objid_aftergroupby
1 125 2
2 342 1
3 263 1
1 125 2
1)我们在查询中添加了新列
2)我们只需在select_analysis中放入“ where count_of_objid_aftergroupby> 1”。
你怎么看?
链接到功能文档http://pro.arcgis.com/en/pro-app/tool-reference/analysis/select.htm
答案 0 :(得分:0)
此问题的答案可能取决于您的特定SQL实现,但从根本上讲,您的问题是您在尝试仍在处理聚合函数的同时避免使用“具有”。 “具有”子句类似于where子句,但在聚合步骤之后进行处理。
所以我认为您不会找到“无需额外结构即可将其简化为Awhere子句”的答案。
我建议尝试通过创建进行聚合的视图来避免该问题,然后再进入需要HAVING子句的部分。如果您提前应用该hading子句,将会更好。
创建额外的列意味着您需要对其进行维护。创建视图意味着您需要对其进行维护。每次维护额外的列时,您都会更改一堆数据,而更改视图则意味着更改代码。根据您的环境,一个可能比另一个更可取,但是在大多数情况下,我希望使用该视图。更改数据通常不如更改代码可靠。
我不知道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查询插入其中。