2011-12-17 175 views
1

我需要查詢的對象稱爲trans__c它具有以下字段SOQL查詢檢索記錄

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 

回答

1

集團通過是唯一真正用於聚合查詢使用,這是一個有點疼痛,當它來到其他你不想聚合的領域。有

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,但它現在逃脫了我(畢竟,這是星期天早上,我只吃了早餐!)。

+0

我相信在做了一個GROUP BY的ID之後,它會拉出不在聚合函數中的所有記錄,因爲Id是唯一的。因此,對MAX()的調用,然後在以Id開頭的所有其他字段上執行GROUP BY應提取所有必需的記錄(全部具有指定的最大值 - 本例中爲datetime)。至少這就是它在我的模式瀏覽器中的表現:) – Adam

+0

第二個想法,你可能是對的。 SOQL中的聚合查詢有點令人困惑。 – Adam

+0

是啊,我幾乎從來沒有發現它們有用,除非我真的想要做總和,數量或平均數! –

1

您的查詢將是這樣的:

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

乾杯

[編輯]

貌似彙總查詢將返回你想的那麼也許什麼萊西是暗示會忽略其他行爲你更好地工作。但合計可以適當適用時,真的很有用。祝你好運。

+0

我實際上創建了這個對象,即使使用'GROUP BY'(並且首先放置'Asset__s'),我仍然得到3條記錄,因爲如果我們希望按照Name和Id進行分組,查詢。 –