修改SQL查询以避免产生这种情况?

时间:2018-11-01 14:58:19

标签: python sql pandas arcpy

我有一列,其中有对一列的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 byhaving语句。

您能建议一种简化过程的方法,使其可以与该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

1 个答案:

答案 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查询插入其中。