如何将PolicyCenter本地SQL查询转换为云版Gosu Query?
将SQL查询转换为PolicyCenter云版本的Gosu Query
原SQL的核心逻辑是:合并联系人主地址与关联地址数据,找出同一联系人在同一生效日期下存在至少两条相同地址类型的记录。以下是对应的Gosu实现:
// 定义统一的数据结构,存储合并后的地址关联数据 class ContactAddressData { var contactId: String var createTime: DateTime var validFrom: DateTime var addressType: String } // 第一部分:获取联系人的主地址数据 var primaryAddressRecords = Query.from(Contact) .join(Address).on(\Contact.PrimaryAddress.Id == \Address.Id) .select(\Contact.Id as contactId, \Address.CreateTime as createTime, \Address.ValidFrom as validFrom, \Address.AddressType as addressType) .toList() // 第二部分:获取联系人关联的其他地址数据 var linkedAddressRecords = Query.from(ContactAddress) .join(Address).on(\ContactAddress.Address.Id == \Address.Id) .select(\ContactAddress.Contact.Id as contactId, \Address.CreateTime as createTime, \Address.ValidFrom as validFrom, \Address.AddressType as addressType) .toList() // 合并两个数据集(对应SQL的UNION ALL) var combinedData = primaryAddressRecords.concat(linkedAddressRecords) // 分组筛选符合条件的记录 var finalResult = Query.from(combinedData) .groupBy(\ContactAddressData.contactId, \ContactAddressData.validFrom, \ContactAddressData.addressType) .having(group => group.Count() >= 2) .select(group => [ contactId: group.Key.contactId, addressType: group.Key.addressType ]) .toList()
关键逻辑说明:
- 联合数据集:用Gosu的
concat方法实现SQL中UNION ALL的效果,通过ContactAddressData类保证两个数据集的字段结构一致。 - 分组与筛选:通过
groupBy指定分组维度,having子句利用分组的Count()方法判断数量条件,最后投影出需要的contactId和addressType。 - 实体关联:直接使用PolicyCenter实体的关联属性(如
Contact.PrimaryAddress、ContactAddress.Contact)替代SQL的JOIN条件,贴合平台的对象模型设计。
内容的提问来源于stack exchange,提问作者Timothée Auffret
相关产品推荐
相关产品推荐

