1

我需要查询一个名为 trans__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
4

2 回答 2

1

Group By 仅用于聚合查询,当涉及到您不想聚合的其他字段时,这有点痛苦。

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

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,但它现在让我无法理解(毕竟,现在是星期天早上,我才刚吃过早餐!)。

于 2011-12-17T23:43:55.653 回答
1

您的查询将如下所示:

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

干杯

[编辑]

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

于 2011-12-17T23:45:56.370 回答