SOQL-запрос для извлечения записей - PullRequest
1 голос
/ 17 декабря 2011

Мне нужно запросить объект с именем 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

Ответы [ 2 ]

1 голос
/ 18 декабря 2011

Ваш запрос будет выглядеть следующим образом:

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

Cheers

[EDIT]

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

1 голос
/ 18 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...