Salesforce 用于检索记录的SOQL查询

Salesforce 用于检索记录的SOQL查询,salesforce,apex-code,soql,Salesforce,Apex Code,Soql,我需要查询一个名为trans_u___c的对象,该对象具有以下字段 id, scantime__c // datetime name asset__c // external id status 我只需要获取状态为挂起的数据,如果有任何重复资产,那么我只需要获取扫描时间为最新的记录 例如 如果有3条记录 asset name scantime Status 1 Rec 1 17-dec

我需要查询一个名为trans_u___c的对象,该对象具有以下字段

 id,
 scantime__c // datetime
 name
 asset__c // external id
 status
我只需要获取状态为挂起的数据,如果有任何重复资产,那么我只需要获取扫描时间为最新的记录

例如

如果有3条记录

   asset         name      scantime              Status

    1            Rec 1      17-dec-2011 13:10     Pending
    1            Rec2       17-dec-2011 13:50     Pending
    2            Rec3       17-dec-2011 13:10     Pending
查询的输出应该是

    1            Rec2       17-dec-2011 13:50     Pending
    2            Rec3       17-dec-2011 13:10     Pending

GROUPBY实际上只用于聚合查询,当涉及到不希望聚合的其他字段时,这有点麻烦

这可能不是正确的方法,但我会获取所有“挂起”记录,然后在代码中执行逻辑(假设您不是大量的结果):

map mapAssetToRecord=new map();
对于(Trans\u c[]sTransArr:[选择Id、名称、资产、扫描时间、状态]
从Trans__c
其中状态(c='Pending']))
{
用于(反式c菌株:Stransar)
{
if(mapAssetToRecord.get(sTrans.Asset_uuC)==null)
{
mapAssetToRecord.put(sTrans.Asset_uuc,sTrans);
}
else if(sTrans.Scan\u Time\u c>mapAssetToRecord.get(sTrans.Asset\u c.Scan\u Time\u c)
{
mapAssetToRecord.put(sTrans.Asset_uuc,sTrans);
}
}
}
//现在,mapAssetToRecord包含您想要的所有记录

可能有一个更优雅的解决方案涉及一些聪明的SOQL,但我现在想不起来了(毕竟,现在是星期天早上,我刚刚吃过早餐!)。

您的查询将如下所示:

SELECT Id, MAX(scantime__c), Name, asset__c, status
FROM trans__c WHERE status = 'Pending' 
GROUP BY Id, Name, asset__c, status
干杯

[编辑]


看起来聚合查询将返回您希望省略的其他行,因此莱西的建议可能对您更有效。但是,如果应用得当,聚合是非常有用的。祝你好运。

我相信在Id上执行GROUP BY后,它将提取聚合函数中没有的所有记录,因为Id是唯一的。因此,对MAX()的调用,然后对以Id开头的所有其他字段执行GROUP BY,应该会提取所有必要的记录(在本例中,所有指定了MAX值的记录都是datetime)。至少在我的模式浏览器中是这样的:)再想想,你可能是对的。SOQL中的聚合查询有点令人困惑。是的,我几乎从来没有发现它们有用,除非我真的想做求和、计数或平均!实际上,我创建了一个对象来处理这个问题,即使使用
groupby
(并将
Asset\u s
放在首位),我仍然会得到3条返回的记录,因为如果我们想在查询中返回这些字段,还必须按名称和Id进行分组。
SELECT Id, MAX(scantime__c), Name, asset__c, status
FROM trans__c WHERE status = 'Pending' 
GROUP BY Id, Name, asset__c, status