如何用SOQL查询客户非最新记录中的最低分数
解决方案
要实现排除客户最新记录后获取最低分,你可以通过以下两种SOQL查询方式解决:
方式一:聚合查询直接计算最低分
这种方式通过关联查询和子过滤,直接按客户分组计算排除最新记录后的最低分,效率较高:
SELECT c.Id, MIN(m.score__c) AS min_score_excluding_latest FROM Client__c c INNER JOIN my_custom_object__c m ON c.Id = m.client__c WHERE NOT (m.client__c = c.Id AND m.date__c = ( SELECT MAX(date__c) FROM my_custom_object__c WHERE client__c = c.Id )) GROUP BY c.Id HAVING COUNT(m.Id) > 1
- 逻辑说明:先通过子查询获取每个客户的最新记录日期,排除该日期对应的所有记录后,对剩余记录按客户分组取最低分
HAVING COUNT(m.Id) > 1用于过滤掉只有一条记录的客户(排除后无数据可计算)
方式二:嵌套子查询保持原结构
如果你需要保留和原查询类似的嵌套子查询格式,可以用以下语句:
SELECT Id, (SELECT score__c, date__c FROM my_custom_objects__r WHERE Id != ( SELECT Id FROM my_custom_object__c WHERE client__c = Client__c.Id ORDER BY date__c DESC, Id DESC LIMIT 1 ) ORDER BY score__c ASC LIMIT 1) FROM Client__c WHERE Id IN (SELECT client__c FROM my_custom_object__c) AND (SELECT COUNT(Id) FROM my_custom_objects__r) > 1
- 逻辑说明:子查询中先排除客户的最新记录(通过
ORDER BY date__c DESC, Id DESC确保唯一获取最新记录),再从剩余记录中取最低分 AND (SELECT COUNT(Id) FROM my_custom_objects__r) > 1同样过滤掉只有一条记录的客户
注意事项
- 如果存在同一客户多条记录共享最新日期的情况,方式一会排除所有该日期的记录,方式二则只排除最新创建的那一条(通过
Id DESC排序),可根据你的业务需求选择 - 若客户只有一条记录,两种方式都会自动过滤,因为排除后无剩余记录可计算最低分
内容的提问来源于stack exchange,提问作者Kees
相关产品推荐
相关产品推荐

