2010-12-10 1 views
5

총 행 수는 10k-100k 행 범위입니다. force.com에서 RAND()를 사용할 수 있습니까? 불행히도 모든 행에는 고유 한 숫자 식별자가 있지만 많은 차이가 있으며 필터링 된 하위 집합에서 임의의 행을 선택하려고합니다.SOQL에서 force.com 데이터베이스의 단일 임의 행을 어떻게 요청합니까?

특별히 효율적인 방법이 없다고 생각하지만, 가능합니까?

궁극적으로 테이블 (또는 특정 필터 기준에 따라 하위 집합)에서 임의의 행 하나를 추출하기 만하면됩니다.

force.com으로 임의의 행을 선택할 수없는 경우 선택할 행을 쿼리하고 모든 행에 순차적 ID (예 : 1-1,035)를 할당 한 다음 해당 행에서 임의의 숫자를 선택합니다 349라고 말하고 349 행을 얻으시겠습니까?

답변

1

아니요, 아니요. ORDER BY RAND() 또는 이와 비슷한 것을 사용할 수 없습니다. 실제 필드 (예 : NULLS LAST 등)로 정렬 할 수 있습니다. 당신은 GROUP BY &을 사용할 수 있습니다. MIN, MAX, COUNT ...

임의의 행을 표시해야하는 목적에 대해 더 자세히 설명해 주시겠습니까? 그렇지 않으면 무엇이 잘못 되었나요? ORDER BY LastModifiedDate DESC LIMIT 1? 또는 100 행을 선택하고 Math.random() or Crypto.getRandomInteger() 모듈로 100?

+0

죄송합니다. 내 시나리오는 간단합니다, 난 그냥 전체 테이블 또는 그것의 하위 집합에서 임의의 orow 잡아 싶습니다. 그러나 항목은 무작위이어야합니다. 나는 마지막 수정일에 의한 주문이 어떻게 도움이되는지 보지 못합니까? RAND()를 사용할 수없는 경우 쿼리를 실행하여 새 ID 열을 임시로 추가하고 개수를 확인한 다음 임의로 하나를 로컬로 선택한 다음 꺼내십시오. –

+0

"임시로 새 ID 열 추가"에 대한 부분을 이해하지 못합니다. 'ALTER TABLE xyz ADD COLUMN' 같은 것이 불가능하다면, 열은 GUI에서만 또는 Eclipse에서 xyz.object 파일을 수정하여 추가 할 수 있습니다. 그러면 다음과 같이 뭔가가 붙어있는 것이 두렵습니다. 데이터의 상당히 큰 부분 집합 (10? 10k 행?)과 그로부터'Math.random()'번째 행 표시 ... – eyescream

1

다음과 같이 시도해 볼 수 있습니다.

  1. 0
  2. 에서 사용 인 Math.random()를 시작하는 순서 열을 추가 - 100 R 1000의 정수를 얻을 수 있음을 곱 1. 0 사이의 범위 진수를 반환한다.

  3. 사용 SOQL 해당 행 SELECT Bar__c, 푸 _C에서 Bar_Seq_Col_ C를 가져올 위치를 Bar_Seq_Col__c = 인 Math.random() * 10

이 당신이 생각할 수있는 단지 샘플 생각이다 보아야 할 이러한 라인은 실현 가능한 아이디어입니다.

11

SOQL OFFSET을 사용하여 임의의 레코드를 선택할 수 있습니다. 여기

는 당신이 그것을 할 방법은 다음과 같습니다 아픈, 지연에 대한

Integer count = [SELECT COUNT() FROM Account]; 
Integer rand = Math.floor(Math.random() * count).intValue(); 
Account a = [SELECT Name FROM Account LIMIT 1 OFFSET :rand]; 
System.debug(a.name); 
+2

"총 행 수가 10k-100k 행의 범위에있는"위치에서 오프셋 (offset)이 작동합니까? 대형 테이블에서는 2,000 행의 최대 오프셋이 문제가 될 수 있습니다. '랜드'는 2,000 명으로 제한 될 수 있습니다. Order By 절을 정의하지 않고 순서 키의 변경이 좋은 배포를 제공하기에 충분할 것이라고 나는 생각하지 않습니다. –

관련 문제