Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Registros aleatorios

Estas en el tema de Registros aleatorios en el foro de PostgreSQL en Foros del Web. Hola muchachos del foro, Necesito sacar 100 registros de forma aleatoria de una tabla. investigue y en encontre que es algo como SELECT * FROM ...
  #1 (permalink)  
Antiguo 22/01/2010, 10:41
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Exclamación Registros aleatorios

Hola muchachos del foro,

Necesito sacar 100 registros de forma aleatoria de una tabla. investigue y en encontre que es algo como

SELECT * FROM tabla ORDER BY random().

yo hice mi query asi:

SELECT * FROM tabla ORDER BY RANDOM() LIMIT 100,

esto ordena los registros aleatoriamente pero siempre me saca los 100 primeros y yo necesito que me saque 100 aleatoriamente de de un total mucho mucho pero mucho mas grande, es decir que me saque 20 de los 100 primeros, 30 del 101 al 20000 y 50 del 20001 al 105000, por ejemplo.
  #2 (permalink)  
Antiguo 22/01/2010, 10:50
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Registros aleatorios

prueba esto:

Código SQL:
Ver original
  1. SELECT * FROM (SELECT *FROM tabla ORDER BY RANDOM()) AS t1 LIMIT 100;

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 22/01/2010, 11:06
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Registros aleatorios

Que gran solucion, incrementa un poco mas la ejecucion de la consulta, pero igual buena solucion.

antes habia hecho por programacion algo como esto.

1) el mismo query en cuestion pero con un count para saber cuantos cumplen la condicion
2) cree un arreglo con esa cantidad de registros cuyos valores van del 1 al n
3) en un segundo ciclo, obtengo aleatoriamente un valor de dicho array y hacia el mismo query con limit 1 offset $array[$valor_aleatorio]

porque lei que hacer algo como lo que tu dices es super costoso, pero esto tambien es muy costoso, pues to que no voy a hacer un query para sacar 100 datos de un total de 500.000 sino 100 querys cada uno saca un dato, pero ese dato se saca de un total de 500.000, que cumplen una condicion.
  #4 (permalink)  
Antiguo 22/01/2010, 11:20
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Registros aleatorios

Otra pregunta que surge de esto:

estos registros yo quiero ordenaros por un par de criterios,

entonces le añadi los otros campos al order by, pero siempre me terminaba sacando los mismos 100 registros pero en orden diferente por el random. el order lo puse tanto en el suquery como en el query principal con el mismo resultado.

en este caso necesitaria saber como ordenarlos por sql despues de tenerlos ya 100% aleaotorios o es mejor ordenar el resulset ya por php?
  #5 (permalink)  
Antiguo 22/01/2010, 13:12
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Registros aleatorios

Estoy haciendo unas pruebas con pocos registros, pero no se presenta lo que dices.

yo tengo una tabla con 12 registros
Código SQL:
Ver original
  1. pruebas=> SELECT *FROM tabla1;
  2.  nov_id |        nov_fecha        |    reporte
  3. --------+-------------------------+---------------
  4.       7 | 2009-09-08 09:49:06.156 | cßrlos
  5.       8 | 2009-09-08 09:49:20.656 | nore±a
  6.       9 | 2009-09-08 09:50:50.312 | cßrlos
  7.      10 | 2009-09-08 09:56:15.046 | cßrlos
  8.      11 | 2009-09-08 09:57:54.39  | daniel
  9.      12 | 2009-09-08 10:06:51.765 | d┬ñniel
  10.      14 | 2009-09-08 10:12:29.281 | repli┬ñaci┬ón
  11.       1 | 2009-03-24 15:34:51.468 | daniel
  12.       2 | 2009-03-24 15:34:54.515 | daniela
  13.       4 | 2009-03-24 15:34:58.062 | daiana
  14.       3 | 2009-03-24 15:34:56.359 | otros
  15.       6 | 2009-05-26 08:36:04.156 | danielito
  16. (12 filas)

si aplico en repetidas ocasiones tu consulta inicial

Código SQL:
Ver original
  1. pruebas=> SELECT *FROM tabla1 ORDER BY random() LIMIT 5;
  2.  nov_id |        nov_fecha        |    reporte
  3. --------+-------------------------+---------------
  4.      11 | 2009-09-08 09:57:54.39  | daniel
  5.      14 | 2009-09-08 10:12:29.281 | repli┬ñaci┬ón
  6.       3 | 2009-03-24 15:34:56.359 | otros
  7.       7 | 2009-09-08 09:49:06.156 | cßrlos
  8.       9 | 2009-09-08 09:50:50.312 | cßrlos
  9. (5 filas)
  10.  
  11. pruebas=> SELECT *FROM tabla1 ORDER BY random() LIMIT 5;
  12.  nov_id |        nov_fecha        |    reporte
  13. --------+-------------------------+---------------
  14.       9 | 2009-09-08 09:50:50.312 | cßrlos
  15.       8 | 2009-09-08 09:49:20.656 | nore±a
  16.      14 | 2009-09-08 10:12:29.281 | repli┬ñaci┬ón
  17.      12 | 2009-09-08 10:06:51.765 | d┬ñniel
  18.       2 | 2009-03-24 15:34:54.515 | daniela
  19. (5 filas)

me saca aleatoriamente de todo el conjunto de datos. No de los primeros 5.

Seguro tienes este problema?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 22/01/2010, 14:04
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Registros aleatorios

Upss, otro descuido mio sorry,

lo que pasaba era lo siguiente, yo estoy sacando datos correspondientes a 3 zonas geograficas, de las cuales perfectamente me podrian salir aprox 50.000 por zona, resulta entonces que el order by RANDOM(), Tambien tenia orden por otros 2 campos.

por lo cual puedo deducir que despues de tener un total aleatorio, me las ordenaba por campo1 y campo 2 por lo cual pareciera que siempre me sacara los 100 primeros registros. de hecho eran diferentes datos, pero de la misma zona geografica.


aqui mando el query final resultante

Código SQL:
Ver original
  1. SELECT  c.nombre AS ciudad,
  2.         t.nombre AS titular,
  3.         t.telefono,
  4.         t.direccion,
  5.         t.nivsocio,
  6.         l.nom_localidad AS nombre_localidad,
  7.         t.cx,
  8.         t.cy
  9. FROM    servcon_telefonos_bogota t
  10. INNER JOIN servcon_localidades l ON (t.localidad = l.cod_localidad AND
  11.                                      l.cod_dane= '11001')
  12. INNER JOIN ciudades c ON (t.coddane = c.coddane AND
  13.                                      c.coddane= '11001')
  14.  
  15. WHERE  t.localidad IN ('10','11','12') AND
  16.        t.coddane ='11001' AND
  17.        t.nivsocio IN ('4','5','6')
  18. ORDER BY RANDOM()
  19. LIMIT 100

Ahora lo que quiero saber es como hago entonces para que estos 100 registros aleatorios me salgan ordenados por estos dos criterios.

Última edición por webness; 22/01/2010 a las 14:11
  #7 (permalink)  
Antiguo 22/01/2010, 14:09
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Registros aleatorios

__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 22/01/2010, 14:23
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Registros aleatorios

Ahora lo que quiero saber es como hago entonces para que estos 100 registros aleatorios me salgan ordenados por estos dos criterios.
  #9 (permalink)  
Antiguo 22/01/2010, 14:35
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Registros aleatorios

Me perdí

despues de la query resultante... ordenar por cuales criterios? cuales campos de la consulta?

algo así?
Código SQL:
Ver original
  1. SELECT *FROM
  2. (SELECT  c.nombre AS ciudad,
  3.         t.nombre AS titular,
  4.         t.telefono,
  5.         t.direccion,
  6.         t.nivsocio,
  7.         l.nom_localidad AS nombre_localidad,
  8.         t.cx,
  9.         t.cy
  10. FROM    servcon_telefonos_bogota t
  11. INNER JOIN servcon_localidades l ON (t.localidad = l.cod_localidad AND
  12.                                      l.cod_dane= '11001')
  13. INNER JOIN ciudades c ON (t.coddane = c.coddane AND
  14.                                      c.coddane= '11001')
  15.  
  16. WHERE  t.localidad IN ('10','11','12') AND
  17.        t.coddane ='11001' AND
  18.        t.nivsocio IN ('4','5','6')
  19. ORDER BY RANDOM()
  20. LIMIT 100)AS t1 ORDER BY t1.campo1,campo2
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: registros, aleatoria
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:14.