SOQL查询以检索记录

时间:2011-12-17 08:45:47

标签: salesforce apex-code soql

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

 id,
 scantime__c // datetime
 name
 asset__c // external id
 status

我只需要获取状态为待处理的数据,如果有任何重复资产,那么我只需要将scantime记录为最新记录。

例如

如果有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

2 个答案:

答案 0 :(得分:1)

Group By只适用于聚合查询,这对于您不想聚合的其他字段来说有点痛苦。

这可能不是正确的方法,但是我会抓住所有'Pending'记录然后在代码中执行逻辑(假设你不是大量的结果):

map<integer, Trans__c> mapAssetToRecord = new map<integer, Trans__c>();

for(Trans__c [] sTransArr : [select Id, Name, Asset__c, Scan_Time__c, Status__c
                               from Trans__c
                              where Status__c = 'Pending'])
{
    for(Trans__c sTrains : sTransArr)
    {
        if(mapAssetToRecord.get(sTrans.Asset__c) == null)
        {
            mapAssetToRecord.put(sTrans.Asset__c, sTrans);
        }
        else if(sTrans.Scan_Time__c > mapAssetToRecord.get(sTrans.Asset__c).Scan_Time__c)
        {
            mapAssetToRecord.put(sTrans.Asset__c, sTrans);
        }
    }
}

// now mapAssetToRecord includes all of the records you want

可能有一个更优雅的解决方案涉及一些聪明的SOQL,但它现在逃脱了我(毕竟,它是星期天早上,我只是吃早餐!)。

答案 1 :(得分:1)

您的查询将如下所示:

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

干杯

[编辑]

看起来聚合查询将返回您想要省略的其他行,因此Lacey建议的内容可能会更好地为您工作。但聚合可以在适当应用时非常有用。祝你好运。