2010-12-10 12 views
5

Die gesamte Zeilenanzahl liegt im Bereich von 10k-100k Zeilen. Kann ich RAND() auf force.com verwenden? Obwohl alle Zeilen einen eindeutigen numerischen Bezeichner haben, gibt es leider viele Lücken, und ich möchte oft eine zufällige Zeile aus einer gefilterten Teilmenge auswählen.Wie fordere ich eine einzelne zufällige Zeile von einer force.com-Datenbank in SOQL an?

Ich vermute, es gibt keine besonders effiziente Möglichkeit, dies zu tun, aber ist es überhaupt möglich?

Letztendlich möchte ich nur eine Zeile aus einer Tabelle (oder einer Teilmenge basierend auf bestimmten Filterkriterien) zufällig extrahieren.

Wenn force.com keine zufällige Zeile auswählen kann, kann ich die Zeilen abfragen und allen Zeilen, zB 1-1,035, sequenzielle IDs zuweisen und dann eine Zufallszahl auswählen Bereich lokal, sagen 349, und dann Zeile 349?

Antwort

1

Nein, Sie können ORDER BY RAND() oder etwas ähnliches nicht verwenden. Sie können nach Echtfeld sortieren (optional mit NULLS LAST etc.). Sie könnten LIMIT, GROUP BY & HAVING obwohl sowie MIN, MAX, COUNT ...

Vielleicht wenn Sie mehr über den Zweck schreiben, für die Sie eine zufällige Zeile anzeigen müssen ... Sonst was falsch ist mit ORDER BY LastModifiedDate DESC LIMIT 1? Oder 100 Zeilen auswählen und zufällige Zeile mit Math.random() or Crypto.getRandomInteger() modulo 100 anzeigen?

+0

Sorry für Verzögerung, krank. Mein Szenario ist einfach, ich möchte nur eine zufällige Zeichnung von der gesamten Tabelle oder einer Teilmenge davon aufnehmen. Aber der Gegenstand muss zufällig sein. Ich sehe nicht, wie die Bestellung nach dem letzten Änderungsdatum hilft? Wenn ich RAND() nicht verwenden kann, kann ich eine Abfrage ausführen, um vorübergehend eine neue ID-Spalte hinzuzufügen, die Anzahl zu ermitteln, eine zufällige lokal zu wählen und sie dann herauszunehmen? –

+0

Ich verstehe nicht den Teil über "eine neue ID-Spalte vorübergehend hinzufügen". Wenn du etwas wie 'ALTER TABLE xyz ADD COLUMN 'meinst - nicht möglich, können Spalten nur von der GUI oder durch Ändern der xyz.object Datei in Eclipse hinzugefügt werden ... Dann habe ich Angst, dass du wirklich mit etwas wie dem Festhalten fest bist ziemlich große Teilmenge der Daten (10? 10k Zeilen?) und Anzeige von 'Math.random()' 'th Reihe davon – eyescream

1

Sie könnten so etwas versuchen.

  1. eine Sequence Spalte hinzufügen von 0.
  2. Verwenden Math.random Starten() - das ist eine Dezimalzahl im Bereich von 0 bis 1. Multiplizieren daß ganze Zahl von 100 R 1000 erhält zurückkehren wird.

  3. Verwendung SOQL diese Zeile SELECT Bar__c, Bar_Seq_Col_ c von Foo _c wo Bar_Seq_Col__c zu holen =: Math.random() * 10

dies ist nur ein Beispiel Idee, die Sie sich vorstellen können Diese Zeilen zu sehen ist eine machbare Idee.

11

Sie können SOQL OFFSET verwenden, um einen zufälligen Datensatz auszuwählen.

Hier ist, wie Sie es tun:

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

Arbeitet OFFSET, wo die "Gesamtzeilenzählung im Bereich 10k-100k Zeilen" ist? Der maximale Offset von 2.000 Zeilen könnte bei großen Tabellen problematisch sein. 'rand' könnte auf 2.000 begrenzt werden. Ich glaube nicht, dass die Änderungen am Bestellschlüssel, ohne die Order By-Klausel zu definieren, ausreichen werden, um eine gute Verteilung zu erreichen. –