2011-12-17 5 views
1
나는 다음과 같은 필드를 가진 개체라는 trans__c를 조회 할 필요가

를 검색 할 수SOQL 쿼리는 기록

I 보류로 상태가 다음 어떤 반복 자산이있는 경우 내가 필요 데이터 만 얻을 필요가
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

ID에 대한 GROUP BY를 수행 한 후 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 개의 레코드가 반환되었습니다. 이름과 ID로 그룹화해야하기 때문에 반환했습니다. 질문. –