Nic_Pickering
通过
新贡献者II

我有一个点特征层,包含关于水监测位置的信息。这包括一个唯一的位置ID,记录值的上限和下限,以及该位置的当前值(我想成为什么)。(表1)

表1:

Gid Location_ID Upper_Limit_m Lower_Limit_m Current_Value_m
1

1千瓦

880

850
2

GW 2

886 856
3.

3兆瓦

884 854

我还有一个表,其中包含上面列出的位置的记录值的历史。(表2)

表2:

Location_ID 日期 Recorded_Value

1千瓦

01/06/2021

867.3

GW 2

01/06/2021 894.1

3兆瓦

01/06/2021 843.9

1千瓦

05/06/2021 862.4

我能够使用Location_ID作为主键在这两个表之间创建关系,使用一对多的基数。

我试图实现的是将表2的Recorded_Value列中的最新值“联接”到表1中的Current_Value列中,用于每个唯一的监视位置(Location_ID)。此外,我需要确保Recorded_Value(来自表2)在上限和下限范围内(来自表1)。

我在想我可能能够使用定义查询(特别是使用SQL)来实现这一点。
这可能吗?如果是这样,在定义查询中使用相关表中的值的语法是什么?或者有没有其他方法可以实现这个目标?

标签(2)
0荣誉
JohannesLindner
常规赛MVP

有几种可能性,这取决于您使用的是什么。

如果你有一个企业地理数据库,显示最新的记录是非常容易的:创建一个查询层(存储在地图文档中)或一个数据库视图(存储在数据库中)使用以下SQL:

选择t1。*, t2。*从表1 t1内部连接(SELECT Location_ID,最大(日期)从表2组通过Location_ID)Location_ID = MaxDates。Location_IDINNER JOIN Table2 t2 ON MaxDates.Location_ID = t2.Location_ID AND MaxDates.MaxDate = t2.Date

这两个工具都可以在“层和表视图”工具集中的数据管理工具箱中找到。然而,确保记录在边界内将更加复杂。

如果你在ArcGIS Pro中工作,你可以使用属性规则。
https://pro.arcgis.com/en/pro-app/2.7/help/data/geodatabases/overview/an-overview-of-attribute-rules..。

//约束规则//表2 //触发:插入,更新//如果Recorded_Value不在表1中定义的上限和下限范围内,则拒绝编辑//加载表1 var tbl_1 = FeatureSetByName($datastore, "Table1", "*", false) //过滤表1通过Location_ID var loc_id = $feature. .Location_ID var loc =第一(过滤器(tbl_1“Location_ID = @loc_id”))/ /测试值在允许范围内,返回true或false var val = $特性。Recorded_Value if(val >= loc. value)Lower_Limit_m&& val <= loc.Upper_Limit_m) { return true } return false
//计算规则//表2 // field: Recorded_Value //触发器:Insert //如果在表2中添加一条新记录,Recorded_Value将被写入表1。CurrentValue_m //假设您添加的记录是最新的记录!//加载表1并获取location var loc_id = $feature的globalID。LocationID var g_id = First(Filter(FeatureSetByName($datastore, "Table1", ["Location_ID", "GlobalID"], false), "Location_ID = @loc_id")))。GlobalID //将Rcorded_Value写入Table1。Current_Value_m返回{"result": $feature。Recorded_Value, "edit": [ { "className": "Table1", "updates": [ {"globalID": g_id, "attributes": {"Current_Value_m": $feature.Recorded_Value}}, ] } ] }

如果以上方法都不适用,可以使用Python脚本,但每次插入新记录时都必须手动运行该脚本。


祝你有愉快的一天!
约翰内斯
0荣誉