2011-12-17 2 views
1

мне нужно запросить объект под названием trans__c, который имеет следующие поляSOQL запроса для получения записей

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 

ответ

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, но он ускользает от меня прямо сейчас (в конце концов, это воскресное утро, и я только что позавтракал!).

+0

Я считаю, что после выполнения GROUP BY на Id он вытащит все записи, которые не находятся в агрегированной функции, поскольку Id уникален. Таким образом, вызов MAX(), а затем выполнение GROUP BY для всех остальных полей, начинающихся с Id, должен вытащить все необходимые записи (все, у которых максимальное значение указано - дата-время в этом случае). По крайней мере, так оно и поступает в моем браузере схемы. – 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 

Приветствия

[EDIT]

Похоже, совокупный запрос будет возвращать дополнительные строки, которые вы хотите, опущенные поэтому, возможно, что Лейси предполагает волю работайте лучше для вас. Но агрегаты могут быть действительно полезными при надлежащем применении. Удачи.

+0

Я фактически создал объект для игры с этим, даже используя 'GROUP BY' (и сначала поставив' Asset__s'). Я все еще получаю 3 записи, потому что нам также нужно группировать по имени и идентификатору, если мы хотим, чтобы те поля, запрос. –

Смежные вопросы