2010-12-10 17 views
5

El recuento total de filas está en el rango de 10k-100k filas. ¿Puedo usar RAND() en force.com? Lamentablemente, aunque todas las filas tienen un identificador numérico único, existen muchas lagunas, y a menudo quisiera seleccionar una fila aleatoria de un subconjunto filtrado de todos modos.¿Cómo solicito una sola fila aleatoria de una base de datos de force.com en SOQL?

Sospecho que no hay una forma particularmente eficiente de hacerlo, pero ¿es posible?

En última instancia, todo lo que quiero hacer es extraer al azar una fila de una tabla (o un subconjunto basado en criterios de filtro específicos).

Si force.com no me deja seleccionar una fila al azar, entonces puedo consultar las filas para seleccionar, y asignar identificaciones secuenciales a todas las filas, digamos 1-1,035, y luego seleccionar un número al azar en ese rango localmente, digamos 349, y luego obtener la fila 349?

Respuesta

1

No, no puede usar ORDER BY RAND() o algo así. Puede ordenar por campo real (opcionalmente con NULLS LAST etc.). Podría usar LIMIT, GROUP BY & TENIENDO así como también MIN, MAX, COUNT ...

Tal vez si escribiera más sobre el propósito para el que necesita mostrar una fila al azar ... De lo contrario, qué está mal con ORDER BY LastModifiedDate DESC LIMIT 1? ¿O seleccionando 100 filas y mostrando una fila al azar con Math.random() or Crypto.getRandomInteger() módulo 100?

+0

Lo siento por retraso, estado enfermo. Mi escenario es simple, solo quiero tomar un orow aleatorio de toda la tabla, o un subconjunto de la misma. Pero el artículo debe ser aleatorio. No veo cómo ayuda ordenar por fecha de última modificación? Si no puedo usar RAND(), ¿puedo ejecutar una consulta para agregar una nueva columna de ID temporalmente, obtener el conteo, seleccionar uno aleatorio localmente y luego sacarlo? –

+0

No entiendo la parte sobre "agregar una nueva columna de ID temporalmente". Si te refieres a algo como 'ALTER TABLE xyz ADD COLUMN' - no es posible, las columnas solo se pueden agregar desde la GUI o modificando el archivo xyz.object en Eclipse ... Entonces, me temo que estás realmente atrapado con algo así como subconjunto bastante grande de datos (10? 10k filas?) y muestra 'Math.random()' 'th th row from ... – eyescream

1

Puede intentar algo como esto.

  1. añadir una columna de secuencia a partir de 0.
  2. Uso Math.random() - que devolverá un decimal que oscila entre 0 a 1. que se multiplican por 100 r 1000 para conseguir entero.

  3. uso SOQL para ir a buscar esa fila SELECT Bar__c, Bar_Seq_Col_ c de Foo _c = donde Bar_Seq_Col__c: Math.random() * 10

esto es sólo una idea de la muestra que se pueda imaginar estas líneas para ver es una idea factible.

11

Puede usar SOQL OFFSET para seleccionar un registro aleatorio.

Así es como se hace:

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

¿Funcionará OFFSET donde el "Recuento total de filas está en el rango 10k-100k filas"? El desplazamiento máximo de 2.000 filas podría ser problemático con tablas grandes. 'rand' podría tener un tope de 2.000. No creo que los cambios en la clave de pedido sin definir la cláusula Order By sean suficientes para dar una buena distribución. –

Cuestiones relacionadas