我需要查询名为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
答案 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建议的内容可能会更好地为您工作。但聚合可以在适当应用时非常有用。祝你好运。